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;
    }
  • 相关阅读:
    js交互数据
    js字符串操作
    js数组操作
    hasattr ,setarrt, getattr属性
    装饰器
    redis数据库安装
    ubuntu中mysql数据库安装与删除
    装换器
    jinjia2
    Laravel框架与ThinkPHP框架的不同
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/5171238.html
Copyright © 2011-2022 走看看