思路
接着67题。这一题就是一般情况,就是一棵普通的二叉树没有顺序。那如何求解呢?
-
比较容易想到的就是用dfs找到到达pq的两条路径,然后进行比对找到最近的相同点。但是这种方法在递归完之后还要进行处理效率比较低。
-
我们设计一个递归函数dfs
1)当当前节点root就是p或者q时,则直接返回该节点。
2)分别递归进入root的左右子树得到两个节点left和right。这两个节点表示了左右子树中是否含有p或q。i.若正好left和right就是p和q,那么直接返回root这个节点就好了,root就是我们要找的最近的公共节点。 ii. 若发现left=null且right=null,则说明root这棵树不存在pq节点,则return null。 iii. 若发现left和right中一个为null另一个不为null,则说明不为null的这个值就是从下面返回的最近的公共节点,直接返回这个节点即可。
代码
/**
* 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) return null;
if(root.val==p.val) return p;
if(root.val==q.val) return q;
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left==null&&right==null) return null;
if(left!=null&&right!=null)
return root;
return left!=null?left:right;
}
}