最近公共祖先代码
灵魂三问
1)这个的函数是做什么的?
--函数功能
-- 正向逻辑推理
2)base case是什么
3)递归后做什么
--反向逻辑推理
具体
1)这个函数是做什么的?
-- 求出来二叉树节点的最近公共祖先
2)base case是什么?
-- root == null时,返回 null
--p == root || q == root; 返回 root
3)得到递归结果后,做什么
--left 和 right均不为空,则 root则为最近公共祖先
-- left 和 right为空,则 无最近公共祖先
-- left 和 right有一个不为空,则 这个不为空的节点就是 两者的最近公共祖先
框架代码
public TreeNode getLeasterAncestor(TreeNode root, TreeNode p, TreeNode q){
// 框架
TreeNode left = getLeasterAncestor(root.left, p, q);
TreeNode rigth = getLeasterAncestor(root.right, p, q);
}
具体
public TreeNode getLeasterAncestor(TreeNode root, TreeNode p, TreeNode q){
if(root == null){
return null;
}
if(p == root || q == root){
return root;
}
// 框架(可画示意图,感受下 这个后序遍历的过程,递归调用,及有值逐层返回的过程)
TreeNode left = getLeasterAncestor(root.left, p, q);
TreeNode rigth = getLeasterAncestor(root.right, p, q);
// 在各自的左右分支上
if(left != null && right != null){
return root;
}
// 左右分支上遍历均没有找到 p和 q,所以返回 null,没有最近公共祖先
if(left == null && right == null){
return null;
}
// 在上边的情况外的其他情况时,说明是在遍历到一个p或q节点,另一个节点是其子节点,所以直接返回遍历到的不为null的节点
return left != null ? left : right;
}
后序遍历后的3种情况示意图