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之间,则为公共祖先
本文介绍了一种寻找二叉搜索树中两个节点的最近公共祖先的有效算法。通过中序遍历找到位于两节点值之间的节点,并进一步优化为直接比较当前节点值与目标节点值,快速定位到公共祖先。
1973

被折叠的 条评论
为什么被折叠?



