zoukankan      html  css  js  c++  java
  • 235. Lowest Common Ancestor of a Binary Search Tree

    1. 问题描述

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
    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).”

            _______6______
           /               
      __2__               ___8__
     /                 /        
    0       4         7           9
           /  
          3   5
                

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

    Subscribe to see which companies asked this question

    Tags: Tree
    Similar Problems: (M) Lowest Common Ancestor of a Binary Tree

    2. 解题思路

    • 首先,提取从根节点到指定节点的路径;
    • 然后,转换成求两个链表中第一个公共节点的问题!

    3. 代码

    class Solution {
    public:
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
        {
            if (root == NULL || p == NULL || q == NULL)
            {
                return NULL;
            }
    
            std::stack<TreeNode *> staPath_p;
            std::stack<TreeNode *> staPath_q;
            GetBinaryTreePath(root, p, staPath_p);
            GetBinaryTreePath(root, q, staPath_q);
    
            int pSize = staPath_p.size();
            int qSize = staPath_q.size();
    
            if (pSize > qSize)
            {
                for (int i=0; i<pSize-qSize; i++)
                {
                    staPath_p.pop();
                }        
            }
            else
            {
                for (int i=0; i<qSize-pSize; i++)
                {
                    staPath_q.pop();
                } 
            }
    
            while (staPath_p.top() != staPath_q.top())
            {
                staPath_p.pop();
                staPath_q.pop();
            }
            return staPath_p.top();
        }
    
    private:
        bool GetBinaryTreePath(TreeNode* root, TreeNode* pDesNode, std::stack<TreeNode *> &staPath)
        {
            bool bIsFind = false;
            staPath.push(root);
            if (root == pDesNode)
            {            
                return true;
            }
    
            if (NULL == staPath.top()->left && NULL == staPath.top()->right)
            {
                staPath.pop();
                return false;
            }
    
            if (NULL != root->left)
            {
                bIsFind = GetBinaryTreePath(root->left, pDesNode, staPath);
            }
            if ( NULL != root->right && !bIsFind)
            {
                bIsFind = GetBinaryTreePath(root->right, pDesNode, staPath);
            }
    
            if (false == bIsFind)
            {
                staPath.pop();
                return false;
            }
            else
            {
                return true;
            }
        }
    };

    4. 反思

  • 相关阅读:
    基于Zabbix 3.2.6版本的Discovery
    Zabbix 3.2.6使用注意事项
    Zabbix 3.2.6安装过程
    自动安装lnmp
    [ORACLE]PL/SQL 用户登录出现ORA-12170:TNS:连接超时 等Oracle无法正常登录问题解决方案
    [ORACLE]尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
    页面从简体字乱码为另外的简体字
    VScode使用问题总结
    数据备份与恢复
    BinLog日志
  • 原文地址:https://www.cnblogs.com/whl2012/p/5778143.html
Copyright © 2011-2022 走看看