题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
解题思路:
利用二叉搜索树的特性:若任一节点的左子树非空,则左子树中的所有节点值都小于根节点的值;若任一节点的右子树非空,则右子树中所有节点值都大于根节点的值。因此从二叉搜索树的根节点开始遍历,将根节点值和开始输入的两个节点值比较,
1、如果当前节点值在开始输入的两个节点值之间,则当前节点为最近的公共祖先;
2、如果当前节点值大于开始输入的两个节点值,则最近的公共祖先位于当前节点的左子树中;
3、如果当前节点值小于开始输入的两个节点值,则最近的公共祖先位于当前节点的右子树中·。
代码(非递归)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || !p || !q) return NULL;
while(root){ //直至下一个节点为空
// 如果节点大于节点最大值,则最近公共祖先在左子树中
if((root->val > p->val) && (root->val > q->val))
root = root->left;
// 如果节点小于节点最小值,则最近公共祖先在右子树中
else if((root->val < q->val) && (root->val < p->val))
root = root->right;
// 如果节点位于两者之间,则root为最近公共祖先
else// if((root->val >=q->val && root->val <= p->val)||
//(root->val >= p->val && root->val <= q->val))
// 较为耗时的判断应放在后面
return root;
}
return NULL; //最后面需要加上返回为空
}
};