68-1 二叉搜索树的最近公共祖先
循环搜索: 当节点 root 为空时跳出;
当 p, q都在 root 的 右子树 中,则遍历至 root.right ;
否则,当 p, q 都在 root 的 左子树 中,则遍历至 root.left ;
否则,说明找到了 最近公共祖先 ,跳出。
返回值: 最近公共祖先 root 。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || !p || !q) return nullptr;
while(root) {
if(root->val < p->val && root->val < q->val) root = root->right;
else if(root->val > p->val && root->val > q->val) root = root->left;
else break;
}
return root;
}
68-2 二叉树的最近公共祖先
这道题采用递归来做,后序遍历的典型题:递归体分为3种情况讨论
如果p和q分别是root的左右节点,那么root就是我们要找的最近公共祖先
如果p和q都是root的左节点,那么返回lowestCommonAncestor(root.left,p,q)
如果p和q都是root的右节点,那么返回lowestCommonAncestor(root.right,p,q)
边界条件的处理稍微麻烦一些:
如果root是null,则说明我们已经找到最底了,返回null表示没找到
如果root与p相等或者与q相等,则返回root
如果左子树没找到,递归函数返回null,证明p和q同在root的右侧,那么最终的公共祖先就是右子树找到的结点
如果右子树没找到,递归函数返回null,证明p和q同在root的左侧,那么最终的公共祖先就是左子树找到的结点
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr || root == p || root == q) return root;
TreeNode* leftnode = lowestCommonAncestor(root->left, p, q);
TreeNode* rightnode = lowestCommonAncestor(root->right, p, q);
if(leftnode == nullptr) {
return rightnode;
}
else if(rightnode == nullptr) {
return leftnode;
}
else {
return root;
}
}