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. 反思

  • 相关阅读:
    imac 截图

    [Python] 安装及环境配置
    冒泡算法
    [转载]分页+双向排序(jquery + ashx)
    【转载】jQuery最佳实践
    【转载】星级评分jQuery插件
    ie浏览器模式判断语句
    jQuery面向对象定制业务框架开发
    【转载】jQuery设计思想
  • 原文地址:https://www.cnblogs.com/whl2012/p/5778143.html
Copyright © 2011-2022 走看看