class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> arr = new ArrayList<>();
build(root,arr);
int max = Math.max(p.val,q.val);
int min = Math.min(p.val,q.val);
TreeNode res = root;
for(int i = 0; i < arr.size();i++) {
if(arr.get(i).val >= min && arr.get(i).val <= max){
if(find(arr.get(i),min) && find(arr.get(i),max)) {
res = arr.get(i);
break;
}
}else if (arr.get(i).val > max) i = Integer.MAX_VALUE;
}
return res;
}
public void build(TreeNode node, List<TreeNode> arr){
if(node == null) return;
build(node.left,arr);
arr.add(node);
build(node.right,arr);
}
public boolean find(TreeNode node, int val){
if(node == null) return false;
if(node.val == val) return true;
return find(node.left,val) || find(node.right,val);
}
}
中序遍历,公共祖先一定在p.val和q.val中间,中间每个子树都判断是否是其公共祖先即可。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode res = root;
while(true){
if(root.val > p.val && root.val > q.val){
root = root.left;
}else if(root.val < p.val && root.val < q.val){
root = root.right;
}else{
res = root;
break;
}
}
return res;
}
}
利用二叉搜索树的特性,当当前节点的值处于p和q之间,则为公共祖先