二叉树day11

236. 二叉树的最近公共祖先

/*
 * 后序递归 反返回值为空则未找到
 * 如果一个子树根节点就是目标值之一且另一个目标值也存在于该子树中 直接返回该子树根节点即可
 * 因为我们会遍历整个树 且无重复树结点 如若另一个目标值不在该子树中 即会在高度更多的子树中找到并返回符合逻辑祖先节点
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == p || root == q || root == null) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //在左右子树中找到
        if (left != null && right != null) return root;
        //在左子树中找到
        else if (left != null && right == null) return left;
        else if(left == null && right != null) return right;
        //均未找到
        else return null;
    }
}

 

235. 二叉搜索树的最近公共祖先

//根据搜索树的特点 自顶向下搜索
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode cur = root;
        while (cur != null) {
            //目标在左子树中
            if (cur.val > p.val && cur.val > q.val) {
                cur = cur.left;
            } else if (cur.val < p.val && cur.val < q.val) {
                //目标在右子树中
                cur = cur.right;
            } else {
                //!(cur.val > p.val && cur.val > q.val) && !(cur.val < p.val && cur.val < q.val)
                //(cur.val <= p.val || cur.val <= q.val) && (cur.val >= p.val || cur.val >= q.val)
                //(cur.val <= p.val && cur.val >= p.val) || (cur.val <= p.val && cur.val >=q.val)
                  || (cur.val <= q.val && cur.val >= p.val) || (cur.val <= q.val && cur.val >= q.val)
                //在上述四种情况任一成立的条件下 cur都是最近公共祖先
                break;
            }
        }
        return cur;
    }
}

 

参考: programmercarl.com

posted @   一梦两三年13  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示