递归
最近公共祖先定义:设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点root.right 都不是 p,q 的公共祖先,则称 root 是“最近的公共祖先”。
若 root是 p,q的 最近公共祖先 ,则只可能为以下情况之一
- 如果p和q在节点root的两侧,那么root就是最近公共祖先
- p = root ,且 q 在 root 的左或右子树中
- q = root ,且 p 在 root 的左或右子树中
具体解法
- 回溯:如果遇到p,q就返回p,q;如果是空节点返回null;如果左右子树不为空则返回当前节点
二叉树只能通过后序遍历(即:回溯)实现从底向上的遍历方式。
- 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果
代码
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr)return nullptr;
if(p == root || q == root)return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left != nullptr && right != nullptr)return root;
if(left != nullptr)return left;
if(right != nullptr)return right;
return nullptr;
}
};
二叉搜索树
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
// 利用二叉搜索树特性:公共祖先的val一定在p和q的val之间,从上至下递归/搜索找到的第一个满足[p->val,q->val]的就是最近公共祖先
// 1. 递归法
if(root == nullptr)return nullptr;
if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
return lowestCommonAncestor(root->right,p,q);
}if(root->val > p->val && root->val > q->val){
return lowestCommonAncestor(root->left,p,q);
}
return root;//在[p->val,q->val]左闭右闭区间,直接返回
//2. 迭代法
//利用二叉搜索树自带方向性
while(root){
if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
root = root->right;
}else if(root->val > p->val && root->val > q->val){
root = root->left;
}else return root;
}
return NULL;
}
};
标签:26,right,return,val,nullptr,随想录,二叉,TreeNode,root
From: https://www.cnblogs.com/neromegumi/p/18569632