二叉树----14.二叉树的最近公共祖先

本题链接

/**

            找到给定节点 p q 的最近公共祖先

            后序遍历先找到目标节点,再回溯逐层向上返回。

            若左右子树返回值都不为空:

                                    则说明两目标节点在当前节点两侧;;;返回当前节点即可

            若左子树与右子树其中一个为空:

                                    则说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right

           

            若当前节点为目标节点之一:(已包含在终止条件中)

                                    则说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节                                            点直接返回即可

*/

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        /**
            找到给定节点 p q 的最近公共祖先
            后序遍历先找到目标节点,再回溯逐层向上返回。

            若左右子树返回值都不为空:
                                    则说明两目标节点在当前节点两侧;;;返回当前节点即可
            若左子树与右子树其中一个为空:
                                    则说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right
            
            若当前节点为目标节点之一:(已包含在终止条件中)
                                    则说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节点,直接返回即可
        */

        return getLCA(root,p,q);
       
    }

    private TreeNode getLCA(TreeNode root, TreeNode p, TreeNode q) {
         if(root == null || root == p || root == q) { //root不为null;说明另一个节点在别的方向或当前目标节点为另一个目标节点的父节点,直接返回即可
            return root;
        }
        
        //后序遍历
        TreeNode left = getLCA(root.left, p, q);
        TreeNode right = getLCA(root.right, p, q);

        //回溯 判断
        if(left != null && right != null) { //说明两目标节点在当前节点两侧; 返回当前节点即可
            return root;             
        }

        if(left != null && right == null) { //说明另一个节点未找到或都在left的子树中;;;返回left即可,反之返回right
            return left;
        } else {
            return right;
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值