Sword68-II——二叉树的最近公共祖先
方法1——递归
- 思路:此题是对上一题的演化,迭代方法肯定不再适用,因为此时无法判断左右子节点大小。因此使用的便是递归
- 对于当前节点,将会有以下情况
- 1、left与right均为空,此时p、q不存在于当前节点的左右子树中(当前节点为叶子节点),此时返回null
- 2、left与right均非空,此时p、q存在于当前节点的左右子树中,且二者处于异侧,此时返回当前节点为最近公共祖先
- 3、left与right其中一个为空,另一个非空,p、q中的一个或两个都存在一侧子树中,此时返回非空的一侧节点为最近公共祖先
- 对于上述情况,只有找到当前节点为p或q节点才能返回非空,其他情况都将返回空,这才会导致第2种情况的断定
- 综合上述情况进行简化
- 当left为空,直接返回right(对于1,right为空,此时也返回空;对于3,right非空,此时返回非空一侧即为right)
- 当left非空,判断右侧是否为空,为空返回left,非空返回当前节点(对于2,right非空,此时返回当前节点;对于3,此时返回非空一侧即为left)
- 特殊情况与临界分析:无
- 终止条件:无
- 步骤:
- 递归终止条件:当前节点越过叶子节点,当前节点为p、q节点中的一个,返回当前节点
- 对左子树递归
- 对右子树递归
- 根据综合情况进行判断
- left为空,返回right
- left非空
- right为空,返回left
- right非空,返回当前节点root
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root.val == p.val || root.val == q.val) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
return left == null ? right : (right == null ? left : root);
}
