二叉树节点的最近邻公共祖先节点
2015-07-21 11:30
253 查看
二叉树节点的最近邻公共祖先节点
介绍
求一个二叉树中两个节点的最近邻公共祖先节点(LCAAccording to the definition of LCA on Wikipedia: “The lowest common
ancestor is defined between two nodes v and w as the lowest node in T
that has both v and w as descendants (where we allow a node to be a
descendant of itself).”
)。旨在掌握递归的运用,练习题目为LeetCode第235题与第236题。
235. BST的LCA
_______6______ / \ __2___ ___8__ / \ / \ 0 _4 7 9 / \ 3 5
BST的特点是结点的左子树上的所有结点的值都不大于它,右子树上所有结点的值都比它大。
因此对于要寻找LCA的两个结点p,q,根节点的值r有:
如果结点值p,q>r,则p,q都是r的右子树上的节点;
如果结点值p,q≤r,则p,q都是r的左子树上的节点;
如果结点值p≤r≤q,则r为p,q的LCA。
具体实现代码为:
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root->val == p->val || root->val == q->val) return root; bool l1 = root->val > p->val; bool l2 = root->val > q->val; if (l1 && l2) lowestCommonAncestor(root->left, p, q); else if (l1 || l2) return root; else lowestCommonAncestor(root->right, p, q); } };
236. BT的LCA
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
BT没有BST那样方便的通过判断结点值大小就能判断结点位置的性质,不过如果我们能够找到结点的中序遍历顺序的话,也就能吧BT转化成BST。但是这样做的弊端是需要在每个结点中加入一个记录中序遍历顺序的变量,也需要体现对二叉树进行一次中序遍历,这并不是我们想要的结果。
现在我们转换一种思维,根结点r与待求结点p,q只有3中关系,也就是235中利用的
p,q都在r的左子树上;
p,q都在r的右子树上;
p,q分别在r的两个子树上,此时r为p,q的LCA。
前两种情况,都可以递归的寻找子树上的第三种情况,因此递归即可完成。
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == p || root == q || root == NULL) return root; TreeNode *lNode = lowestCommonAncestor(root->left, p, q); TreeNode *rNode = lowestCommonAncestor(root->right, p , q); if (lNode && rNode) return root; else if(lNode) return lNode; else return rNode; } };
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C语言二叉树的非递归遍历实例分析
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- C++非递归队列实现二叉树的广度优先遍历
- php递归创建目录的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)