LCA最小公共父节点的解题思路

Posted mered1th

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LCA最小公共父节点的解题思路相关的知识,希望对你有一定的参考价值。

LCA最小公共父节点解法:

1、二叉搜索树:

中序遍历是升序,前序遍历即按序插入建树的序列。

二叉搜索树建树最好用前序+中序,如果用前序建树,最坏情况会退化为线性表,超时。

最近公共祖先甲级: A1143,1151

利用二叉搜索树的性质寻找结点u和v的最低公共祖先(递归解法)
1)如果根结点的值大于max(u,v),说明u和v均在根结点的左子树,则进入根结点的左子结点继续递归
2)如果根结点的值小于min(u,v),说明u和v均在根结点的右子树,则进入根结点的右子结点继续递归
3)剩下的情况就是,根结点的值比其中一个值大,比另外一个小,则该结点就是结点u,v的最低公共祖先了

二叉搜索树核心代码:

Node* getLCA(Node* root,int u,int v)
{
    if(root==nullptr) return nullptr;
    if(root->val > max(u,v)) return getLCA(root->lchild,u,v);
    else if(root->val < min(u,v)) return getLCA(root->rchild,u,v);
    else return root;
}

2、普通二叉树

递归解法
在递归函数中,我们首先判断当前结点是否为空,若为空,直接返回;或者,当前结点是否就是u或v,若是,也直接返回该结点。否则,就对其左右孩子结点分别调用递归函数。可以想到,结点u和v有以下三种情况:
  1)u和v分别位于当前结点的左右两侧;
  2)u和v都在当前结点的左子树中;
  3)u和v都在当前结点的右子树中。
若u和v分别位于左右子树中,那么对左右子结点调用递归函数,会分别返回u和v结点的位置,而当前结点正好就是u和v的最小共同父结点,直接返回当前结点即可。

若u和v同时位于左子树,这里有两种情况,一种情况是left会返回u和v中较高的那个位置,而right会返回空,所以我们最终返回非空的left即可;还有一种情况是会返回u和v的最小父结点,就是说当前结点的左子树中的某个结点才是u和v的最小父结点,会被返回。

若u和v同时位于右子树,同样这里有两种情况,一种情况是right会返回u和v中较高的那个位置,而left会返回空,所以我们最终返回非空的right即可,还有一种情况是会返回u和v的最小父结点,就是说当前结点的右子树中的某个结点才是u和v的最小父结点,会被返回。

核心代码:

Node* getLCA(Node* root,int u,int v)
{
    if(root==nullptr || root->val==u || root->val==v) return root;
    Node* left=getLCA(root->lchild,u,v);
    Node* right=getLCA(root->rchild,u,v);
    if(left && right) return root;
    else return (left?left:right);
}

参考:https://www.cnblogs.com/kkmjy/p/9529771.html









以上是关于LCA最小公共父节点的解题思路的主要内容,如果未能解决你的问题,请参考以下文章

寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)

二叉树最近公共祖先

二叉树最近公共祖先

LCA 最近公共祖先

最近公共祖先 LCA 递归非递归

LCA最近公共祖先(POJ1330)