1.使用两点的路径的方法求解(栈)
public boolean getPath(TreeNode root, TreeNode node,Stack<TreeNode> stack) {
if(root == null) {
return false;
}
stack.push(root); //先把根放进去
if(root == node) { //判断节点是否是目标节点
return true;
}
boolean flgLeft = getPath(root.left,node,stack);//递归左树
if(flgLeft) { //如果找到了,就返回true
return true;
}
boolean flgRight = getPath(root.right,node,stack);//递归右树
if(flgRight) { //如果找到就返回true
return true;
}
stack.pop(); //root的左和右为null时,证明这条路劲不通,删除这个节点
return false;
}
public TreeNode lowstCommonAncestor(TreeNode root,TreeNode p,TreeNode q) {
if(root == null) {
return null;
}
if(root == p || root == q) { //
return root;
}
TreeNode left = lowstCommonAncestor(root.left,p,q);
TreeNode right = lowstCommonAncestor(root.right,p,q);
if(left != null && right != null) { //第一种情况:节点p,q分布在root的左右
return root;
}else if(left != null) { //第二种情况:右树right为空,节点p,q都在左侧
return left;
}else {
return right;//第二种情况:左树right为空,节点p,q都在右侧
}
}
}
2.递归求解
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) {
return null;
}
if(p == root ||q == root) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left != null && right != null) {
return root;
}else if(left != null) {
return left;
}else {
return right;
}
}
}