zoukankan      html  css  js  c++  java
  • Lowest Common Ancestor of a Binary Tree leetcode

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______3______
           /              
        ___5__          ___1__
       /              /      
       6      _2       0       8
             /  
             7   4
    

    For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

     

    Subscribe to see which companies asked this question

    非递归实现:

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr)
            return root;
        stack<TreeNode*> sta;
        vector<TreeNode*> vec;
        bool tag1 = false;
        bool tag2 = false;
        sta.push(root);
        TreeNode* lastRoot = root;
        while (!sta.empty())
        {
            root = sta.top();    
            if (root == p) {
                if(tag1 == false && tag2 == false)
                    vec.push_back(root);
                tag1 = true;
            }
            else if (root == q) {
                if (tag2 == false && tag1 == false)
                    vec.push_back(root);
                tag2 = true;
            }
            if (!tag1 && !tag2)
                vec.push_back(root);
            if (tag1 && tag2 && find(vec.begin(), vec.end(), root) != vec.end())
                return root;
                    
            if (lastRoot != root->right)
            {
                if (lastRoot != root->left) {
                    if (root->left != nullptr) {                    
                        sta.push(root->left);
                        continue;
                    }
                }
                if (root->right != nullptr) {
                    sta.push(root->right);
                    continue;
                }
            }
            lastRoot = root;
            sta.pop();
        }
        return nullptr;
    }

    递归实现:

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || root == p || root == q) return root;
        TreeNode* l = lowestCommonAncestor(root->left, p, q);
        TreeNode* r = lowestCommonAncestor(root->right, p, q);
        return l && r ? root : l ? l : r;
    }
  • 相关阅读:
    使用replaceAll替换“/”为“/”
    如何在Lucene里面进行数字范围搜索 (Numeric Range Query)
    Java中的参数传递
    安装配置WordPress 3.0的多站点功能
    Apache Hadoop 项目介绍
    Java中的Set操作
    使用Desktop API in Java SE 6打开文件或者网页
    Java集合(转帖)
    数据结构牛客网习题纠错130
    PAT 1045 Favorite Color Stripe[dp][难]
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5171238.html
Copyright © 2011-2022 走看看