Leetcode 246 二叉数的最近公共祖先
递推算法感悟
1.递推时自底向上的算法,真正的原理是从叶子结点开始一步一步向上推进
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null)
return null;
if (root.val ==p.val || root.val == q.val)
return root;
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left!= null && right != null)
return root;
if (left == null)
return right;
if (right == null)
return left;
return null;
}
2.在下面这段代码之前,对当前结点的判断
搜索到边界条件时停止递归的条件,每次递归到的结点都会进行此判断
if (root == null)
return null;
if (root.val ==p.val || root.val == q.val)
return root;
3.这两句是对递归得到的结果,开启了递归
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
4.每段递归结束后对结果的处理
if(left!= null && right != null)
return root;
if (left == null)
return right;
if (right == null)
return left;
本题思路
当遍历到一个结点treeNode的时候,如果当前结点的值为p.val 或者q.val,
结论
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
是对左右子树的遍历
if(left!= null && right != null)
return root;
if (left == null)
return right;
if (right == null)
return left;
return null;
是对左右子树得到结果的处理
if (root == null)
return null;
if (root.val ==p.val || root.val == q.val)
return root;
这个可以看成是对叶子结点的处理