二叉树的最近公共祖先
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
思路:
一开始看到这个题目的反应是,如果可以从p,q节点往上搜索就好了。于是想到了对于二叉树的后序遍历,二叉树的后序遍历返回时需要携带信息表示以该节点为根的子树是否包含需要寻找的节点p或q,或者是返回已经找到的最近公共祖先。我们去递归的查找:
base case:
1.root为null,直接返回null;
2.root为p或q,直接返回root。
other case:
1.当root的左子树遍历后返回的不为null,且root的右子树遍历后返回的也不为null时,代表root即最近公共祖先。
2.当root的左子树后序遍历返回结果或右子树后序遍历返回结果其中之一为null,另外一个不为null的时候,代表在以root为根的子树中包需要寻找的p/q节点,也有可能这个节点就是最近公共祖先节点,那么继续向上返回这个节点。
3.当root的左子树后序遍历返回结果为null,同时root右子树后序遍历返回结果也为null,那么代表以该root为根节点的树上没有要找的节点,于是也向上传递null。
代码:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) return null;
if(root == p || root == q) return root;
TreeNode leftResult = lowestCommonAncestor(root.left, p, q);
TreeNode rightResult = lowestCommonAncestor(root.right, p, q);
if(leftResult!=null && rightResult!=null){
return root;
}
if(leftResult==null && rightResult==null){
return null;
}
return leftResult==null ? rightResult : leftResult;
}
}