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 }
  • 相关阅读:
    解决网页元素无法定位的几种方法
    转载:pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'
    关于list的漏删
    春风十里不如你
    记我兵荒马乱的一周(0808-0812)--用户反馈及修改点验证
    vue定时器
    业务系统多机房多活实现思路
    分布式开发之:id生成器
    关于部署系统的一些思考
    web系统认证与鉴权中的一些问题
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13492550.html
Copyright © 2011-2022 走看看