美文网首页算法
二叉树的公共祖先

二叉树的公共祖先

作者: 小鱼嘻嘻 | 来源:发表于2020-10-27 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

    相关文章

      网友评论

        本文标题:二叉树的公共祖先

        本文链接:https://www.haomeiwen.com/subject/ueitvktx.html