二叉树的公共祖先
2020-10-27 本文已影响0人
小鱼嘻嘻
问题1
平衡二叉树的公共祖先,找到该树中两个指定节点的最近公共祖先
原理
- 首先需要了解平衡二叉树的特性,平衡二叉树的左子树的节点值小于根节点的值,平衡二叉树的右子树的节点值大于根节点。
- 判断p,q和root的关系,如果root>p&&root>q说明应该递归遍历左子树;如果p<root&&q<root 说明应该递归遍历右子树,否则就是当前root节点。
代码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){
return null;
}
if(root.val>p.val&&root.val>q.val){
return lowestCommonAncestor(root.left,p,q);
}
if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right,p,q);
}
return root;
}
}
注意事项
- root<p&&root<q 和root>p&&root>q 这两个都是且的关系
问题2
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
原理
- 递归找左子树,递归找右子树
- 左子树为空,返回右子树;右子树为空返回左子树;左右子树都不为空,返回当前节点
- 递归的终止条件,当前节点为空,或者当前节点等于p或者当前节点等于q
代码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||root==p||root==q){
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left!=null&&right!=null){
return root;
}
return left==null?right:left;
}
}
注意事项
- 递归的终止条件:当前节点为空,或者当前节点等于p或者当前节点等于q