zoukankan      html  css  js  c++  java
  • 面试题50:树中两个节点最低公共祖先

    树是查找二叉树

    也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。

    树不一定是二叉树,每个结点都有一个指针指向它的父结点

    我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。

    一般树

    找到两棵树的路径,遍历找公共节点

     1 bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list<TreeNode*>& path)
     2 {
     3     if(pRoot == pNode)
     4         return true;
     5  
     6     path.push_back(pRoot);
     7  
     8     bool found = false;
     9 
    10     vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin();
    11     while(!found && i < pRoot->m_vChildren.end())
    12     {
    13         found = GetNodePath(*i, pNode, path);
    14         ++i;
    15     }
    16  
    17     if(!found)
    18         path.pop_back();
    19  
    20     return found;
    21 }
    22 
    23 TreeNode* GetLastCommonNode
    24 (
    25     const list<TreeNode*>& path1, 
    26     const list<TreeNode*>& path2
    27 )
    28 {
    29     list<TreeNode*>::const_iterator iterator1 = path1.begin();
    30     list<TreeNode*>::const_iterator iterator2 = path2.begin();
    31     
    32     TreeNode* pLast = NULL;
    33  
    34     while(iterator1 != path1.end() && iterator2 != path2.end())
    35     {
    36         if(*iterator1 == *iterator2)
    37             pLast = *iterator1;
    38  
    39         iterator1++;
    40         iterator2++;
    41     }
    42  
    43     return pLast;
    44 }
    45 
    46 TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2)
    47 {
    48     if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL)
    49         return NULL;
    50  
    51     list<TreeNode*> path1;
    52     GetNodePath(pRoot, pNode1, path1);
    53  
    54     list<TreeNode*> path2;
    55     GetNodePath(pRoot, pNode2, path2);
    56  
    57     return GetLastCommonNode(path1, path2);
    58 }
  • 相关阅读:
    [bzoj4241] 历史研究 (分块)
    [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
    20180710 考试记录
    [luogu2047 NOI2007] 社交网络 (floyed最短路)
    [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)
    [luogu1600 noip2016] 天天爱跑步 (树上差分)
    [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)
    [poj 3539] Elevator (同余类bfs)
    [BZOJ1999] 树网的核 [数据加强版] (树的直径)
    bzoj2301 [HAOI2011]Problem b
  • 原文地址:https://www.cnblogs.com/raichen/p/5693063.html
Copyright © 2011-2022 走看看