码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-17 00:59:00      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:.com   节点   int   nod   code   递归   nullptr   前序遍历   root   

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最小公共父节点的解题思路

标签:.com   节点   int   nod   code   递归   nullptr   前序遍历   root   

原文地址:https://www.cnblogs.com/Mered1th/p/10389785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!