题目给出了,两个节点在书中的指针,利用指针对应的数据及BST的性质处理;
要利用 BST的性质:
节点 NN 左子树上的所有节点的值都小于等于节点 NN 的值
节点 NN 右子树上的所有节点的值都大于等于节点 NN 的值
左子树和右子树也都是 BST
算法:
从根节点开始遍历树
如果节点 pp 和节点 qq 都在右子树上,那么以右孩子为根节点继续 1 的操作
如果节点 pp 和节点 qq 都在左子树上,那么以左孩子为根节点继续 1 的操作
如果条件 2 和条件 3 都不成立,这就意味着我们已经找到节 pp 和节点 qq 的 LCA 了
/**
* 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) {
int pval = p.val;
int qval = q.val;
int curVal = root.val;
if(pval >curVal && qval >curVal) return lowestCommonAncestor(root.right,p,q);
if(pval <curVal && qval <curVal) return lowestCommonAncestor(root.left,p,q);
return root;
}
}
方法二:迭代
/**
* 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) {
int pval = p.val;
int qval = q.val;
TreeNode cur = root;
while(cur!=null){
int curVal = cur.val;
if(pval >curVal && qval >curVal) cur = cur.right;
if(pval <curVal && qval <curVal) cur = cur.left;
return cur;
}
return null;
}
}