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

    问题:

      求树中两个节点的公共祖先。

    可能情况1:树为二叉搜索树。

      我们可以从根节点开始搜索,如果当前节点的值比两个节点的值都大,那么下一步遍历左子树。

      如果当前节点的值比两个节点的值都小,那么下一步遍历右子树。

      如果当前节点的值比一个节点大,比另一个节点小,那么当前节点就是最低公共祖先节点。

    代码:

     1 #include <iostream>
     2 #include <algorithm>
     3 
     4 struct TreeNode        // 树的节点定义
     5 {
     6     int val;
     7     TreeNode* left;
     8     TreeNode* right;
     9 };
    10 
    11 TreeNode* LCA_search1(TreeNode* proot, int nodea, int nodeb)
    12 {
    13     if(proot == nullptr)
    14         return nullptr;
    15     
    16     if( proot->val > std::max(nodea, nodeb) )
    17     {
    18         return LCA_search1(proot->left, nodea, nodeb);
    19     }
    20     else if( proot->val < std::min(nodea, nodeb) )
    21     {
    22         return LCA_search1(proot->right, nodea, nodeb);
    23     }
    24     else
    25     {
    26         return proot;
    27     }
    28 }

    可能情况2:树的节点中有指向父节点的指针

      有了父节点指针,我们可以在两个待查找的节点向上搜索,相当于查找两个链表的第一个公共节点。

    可能情况3:树不是二叉搜索树,也没有指向父节点的指针

       从根节点开始进行dfs搜索,分别找到到达这两个节点的路径,这两条路径的最后一个公共节点就是最低公共祖先。

    代码:

     1 struct TreeNode
     2 {
     3     int val;
     4     TreeNode *left;
     5     TreeNode *right;
     6 };
     7 
     8 TreeNode *LCA_search2(TreeNode* proot, TreeNode *nodea, TreeNode *nodeb)
     9 {
    10     if(proot == nullptr || proot == nodea || proot == nodeb)
    11         return proot;
    12     
    13     TreeNode *left = LCA_search2(proot->left, nodea, nodeb); // 找左子树是否存在nodea和nodeb
    14     
    15     TreeNode *right = LCA_search2(proot->right, nodea, nodeb);
    16     
    17     if(left && right)
    18         return root;
    19     else
    20         return left ? left : right;
    21 }
  • 相关阅读:
    面向对象OO第15次作业总结
    面向对象OO第9-11次作业总结
    一文讲完最基本的图算法——图的存储、遍历、最短路径、最小生成树、拓扑排序
    字符串匹配问题的KMP算法
    提问回顾与个人总结
    软工结对作业—最长单词链
    软工第1次个人作业
    软工第0次个人作业
    OO最后一次作业
    JSF生存指南P1
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13492550.html
Copyright © 2011-2022 走看看