剑指 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; } }
浙公网安备 33010602011771号