给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
二叉搜索树的性质:左子树都比当前结点小,右子树都比当前结点大。
① 如果两个节点值都小于根节点,说明他们都在根节点的左子树上,我们往左子树上找。
②如果两个节点值都大于根节点,说明他们都在根节点的右子树上,我们往右子树上找。
③如果一个节点值大于根节点,一个节点值小于根节点,说明他们他们一个在根节点的左子树上一个在根节点的右子树上,那么根节点就是他们的最近公共祖先节点。
对比二叉树那题,显然发现二叉搜索树根据它的性质,使搜索方向非常明确。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { int mint=min(p->val,q->val); int maxt=max(p->val,q->val); while(root){ if(root->val<=maxt&&root->val>=mint){//等于号是因为可能p为q祖先或者q为p祖先 return root; } if(root->val<p->val&&root->val<q->val){ root=root->right; }else{ root=root->left; } } return root; }