二叉树的公共祖先

问题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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容