題目給出了,兩個節點在書中的指針,利用指針對應的數據及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;
}
}