LCA二叉树任意两节点的共同祖先
2011-10-24 17:08
246 查看
在一棵二叉树中任意指定两节点,求这两节点的最近共同祖先,即LCA问题。
后序遍历解法:
Case 1::两节点没有血缘关系,即其中一节点不是另一节点的父辈或子辈,则它们必定在共同祖先的不同子树上。也就是说,如果一个节点的左子树能找到一节点,其右子树能找到另一个节点,则这个节点就是该两节点的共同祖先。
Case 2:两节点有血缘关系,则返回深度较小的那个节点的父节点。
以下是算法代码,适用情况:二叉树中没有与指定节点相同的节点。
后序遍历解法:
Case 1::两节点没有血缘关系,即其中一节点不是另一节点的父辈或子辈,则它们必定在共同祖先的不同子树上。也就是说,如果一个节点的左子树能找到一节点,其右子树能找到另一个节点,则这个节点就是该两节点的共同祖先。
Case 2:两节点有血缘关系,则返回深度较小的那个节点的父节点。
以下是算法代码,适用情况:二叉树中没有与指定节点相同的节点。
bool LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult,TNode * parent) { if (!root) { return false; } //L查看左子树能否找到其中一个节点 bool falg1=LCA(root->left,node1,node2,restult,root); //R查看右子树能否找到其中一个节点 bool falg2=LCA(root->right,node1,node2,restult,root); if (falg1&&falg2) { //左右子树各找到一个节点,则当前节点为两节点的最近共同祖先。 restult=root; return true; } //D查看当前节点是否为其中一个节点 if (root->data==node1->data||root->data==node2->data) { if (falg1||falg2) { //在左子树或右子树上已找到一个节点,当前节点为两节点中的另一个节点,当前子树的父节点为两节点的最近共同祖先。 restult=parent; } //else: 代表当前节点的父节点的某一子树上找到了一个节点 return true; } return falg1||falg2; } void LCA(TNode * root,TNode * node1,TNode * node2,TNode * &restult) { LCA(root,node1,node2,restult,NULL); }
相关文章推荐
- LCA问题:求二叉树中任意两个节点的最近公共祖先
- 算法:在二叉树中寻找两个节点的共同祖先
- 求二叉树中两个节点的最小公共祖先(LCA)
- Cracking-- 4.7 在一颗二叉树中找两个节点的第一个共同祖先
- 算法:在二叉树中寻找两个节点的共同祖先
- 每日一题系列 - 二叉树节点求共同祖先
- 求二叉树任意两个结点最近的共同祖先
- 利用栈求二叉树中两节点的最近共同祖先(无父节点指针)
- 求解二叉树中两个节点的最近公共祖先(LCA)
- 求二叉树中任意两结点的最近共同祖先的算法及其证明
- 二叉树中任意两个节点的最近公共祖先节点
- 二叉树——查找两个任意节点的最近祖先
- LCA算法求任意两个节点之间的最小公共祖先(最短路径)
- 二叉树----第二篇(求两节点最低公共祖先,求任意两节点距离)
- 树---求给定二叉树中两节点的最低公共祖先(LCA)
- 二叉树——查找两个任意节点的最近祖先
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
- 求二叉树的任意两个节点的最近公共祖先
- 二叉搜索树中任意两个节点的最近共同父父节点1(LCA问题)