剑指 Offer 68 - II. 二叉树的最近公共祖先

第一个if循环应该很容易看懂。

写一下为什么最后一个root节点不会一直返回,因为当某一个节点left和right都不为空,返回该节点后。

该节点的父节点肯定会有一边为空,而另一边就是上面返回的root节点。

就会执行左不为空返回右,右不为空返回左,向上返回找到的那个节点。

 

这种递归方法会遍历到每个节点。

在这棵树的根节点处,最后返回依旧是一边为空,另一边为从下面返回过来的目标节点。

依然是用 左不为空返回右,右不为空返回左 的判断作为函数返回值返回真正的结果。

剑指 Offer 68 - II. 二叉树的最近公共祖先

/**
 * 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) {
        if(root == null || root == p || root == q)  
            return root;
        TreeNode left  = lowestCommonAncestor(root.left,  p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //当left和right同时为空:说明root的左,右子树中都不包含p,q返回null
        if(left == null && right == null) return null;

        //一边为空,则在p,q另一边
        if(left  == null) return right;
        if(right == null) return left;

        //left和right都不为空,说明p,q在当前节点两侧返回root(当前节点)
        return root;
    }
}

 

posted @ 2021-03-29 22:18  星予  阅读(46)  评论(0)    收藏  举报