美文网首页
最近公共父节点

最近公共父节点

作者: LxxxR | 来源:发表于2018-05-26 11:21 被阅读0次
1,排序二叉树

p<最近父节点<q

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL) return root;
        TreeNode *t=root;
        while(1){
            if(t->val>p->val && t->val>q->val)
                t=t->left;
            else if(t->val<p->val && t->val<q->val)
                t=t->right;
            else
                return t;
        }
    }
2,带指向父节点的二叉树

从这两个节点回溯到根节点,得到两条路径,转化为求两个链表的第一个公共节点

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL) return root;
        
        vector<TreeNode*> a1,a2;
        TreeNode* t=p;
        while(t!=root){
            a1.push_back(t);
            t=t->pre;
        }
        a1.push_back(root);

        t=q;
        while(q!=root){
            a2.push_back(t);
            t=t->pre;
        }
        a2.push_back(root);

        int len1=a1.size(),len2=a2.size();
        int i=0,j=0;
        if(len1>len2)
            i=len1-len2;
        else
            j=len2-len1;
        for(;i<len1&&j<len2;i++,j++){
            if(a1[i]==a2[j])
                return a1[i];
        }

    }
3,二叉树

递归:
该函数:若以root为根,包含p,q,返回最近父节点;若只包含一个p或q,返回p或q;若都不包含,返回NULL。时间O(n)

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)
            return NULL;
        if(p=root || q=root)
            return root;

        TreeNode *left = lowestCommonAncestor(root->left, p, q);
        TreeNode *right = lowestCommonAncestor(root->right, p, q);
        if(left && right) 
            return root; 
        else
            return left? left:right;
    }

非递归:
定义一个子函数findPath()寻找两条路径,再转化为求两个链表的第一个公共节点。时间O(n)

bool findPath(TreeNode* root,TreeNode* p,stack<TreeNode*> &path)
{
    if(root){
        path.push(root);

        if(root==p)
            return true;
             
        bool found=false;
        if(!found)
            found=findPath(root->left,p,path);
        if(!found)
            found=findPath(root->right,p,path);

        if(!found)
            path.pop();  //不是答案时要出栈,是答案时要留栈
        return found;  
    }
    return false;
}

相关文章

  • 最近公共父节点

    1,排序二叉树 p<最近父节点

  • 最近公共祖先系列

    最近公共祖先I 描述: 给定一棵二叉树,找到两个节点的最近公共父节点 (LCA)。最近公共祖先是两个节点的公共的祖...

  • lintcode 最近公共祖先

    给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。最近公共祖先是两个节点的公共的祖先节点且具有最大深度。样例...

  • 2020-04-02

    最近公共父节点(两个节点,都可能为null,都可能不在树上。)

  • Longest Common Ancetor

    二叉树公共父节点专题 BST,二叉搜索树的公共父节点 https://leetcode.com/problems/...

  • 小米-基础算法-最近公共祖先

    给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。两个节点的最近公共祖先,是指两个节点的所有父...

  • 算法—— 最近公共祖先 III

    给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。两个节点的最近公共祖先,是指两个节点的所有父...

  • JS之节点操作元素

    父级节点:node.parentNode 可返回某节点的父节点,注意是最近的一个父节...

  • 2018-07-05待做题目

    2.求一颗树两个节点的最近的公共父节点3.ThreadLocal如果引用了一个Static变更是否是线程安全的4....

  • LCA_最近公共祖先

    LCA 最近公共祖先在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上...

网友评论

      本文标题:最近公共父节点

      本文链接:https://www.haomeiwen.com/subject/hpxpjftx.html