`
rein07
  • 浏览: 21828 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

二叉树中的最近公共祖先问题

 
阅读更多
题目:要求寻找二叉树中两个节点的最近的公共祖先,并将其返回。

view sourceprint?1 class Node   

2 {   

3    Node * left;   

4    Node * right;   

5    Node * parent;   

6 };   

7 /*查找p,q的最近公共祖先并将其返回。*/  

8 Node * NearestCommonAncestor(Node * p,Node * q);

算法思想:这道题的关键在于每个节点中包含指向父节点的指针,这使得程序可以用一个简单的算法实现。首先给出p的父节点p->parent,然后将q的所有父节点依次和p->parent作比较,如果发现两个节点相等,则该节点就是最近公共祖先,直接将其返回。如果没找到相等节点,则将q的所有父节点依次和p->parent->parent作比较......直到p->parent==root。

程序代码:

view sourceprint?01 Node * NearestCommonAncestor(Node * root,Node * p,Node * q)   

02 {   

03     Node * temp;   

04          while(p!=NULL)   

05     {   

06         p=p->parent;   

07         temp=q;   

08         while(temp!=NULL)   

09         {   

10             if(p==temp->parent)   

11                 return p;   

12             temp=temp->parent;   

13         }   

14     }   

15 }

题目:将一个单链表逆转——原来的头指针变为尾指针,原来的尾指针变为头指针。

算法思想:从链表的头结点开始依次逆转,最终将整个链表逆转。

程序代码:

view sourceprint?01 /*节点的类定义*/  

02 class Node   

03 {   

04     Node * next;   

05 };   

06     

07 /*链表的类定义*/  

08 class List   

09 {   

10     Node * head;   

11 };   

12     

13 /*逆转函数——将一个单链表逆转*/  

14 void ReverseList(List & list)   

15 {   

16     Node * pre=NULL;   

17     Node * cur=list.head;   

18     Node * back=cur->next;   

19     

20     while(back!=NULL)   

21     {   

22         cur->next=pre;   

23         pre=cur;   

24         cur=back;   

25         back=cur->next;   

26     }   

27     

28 }

知识拓展:对于第二个二叉树的问题,如果节点中不包含指向父节点的指针应该怎么计算?

算法思想:如果一个节点的左子树包含p,q中的一个节点,右子树包含另一个,则这个节点就是p,q的最近公共祖先。

程序代码:

view sourceprint?01 /*查找a,b的最近公共祖先,root为根节点,out为最近公共祖先的指针地址*/  

02 int FindNCA(Node* root, Node* a, Node* b, Node** out)    

03 {    

04     if( root == null )    

05     {    

06         return 0;    

07     }   

08     

09     if( root == a || root == b )   

10     {       

11         return 1;   

12     }   

13     

14     int iLeft = FindNCA(root->left, a, b, out);   

15     if( iLeft == 2 )   

16     {       

17         return 2;   

18     }   

19     

20     int iRight = FindNCA(root->right, a, b, out);   

21     if( iRight == 2 )   

22     {       

23         return 2;   

24     }   

25     

26     if( iLeft + iRight == 2 )   

27     {      

28         *out == root;   

29     }   

30     return iLeft + iRight;   

31 }   

32     

33 void main()    

34 {    

35     Node* root = ...;    

36     Node* a = ...;    

37     Node* b = ...;    

38     Node* out = null;    

39     int i = FindNCA(root, a, b, &out);    

40     if( i == 2 )    

41     {    

42         printf("Result pointer is %p", out);    

43     }    

44     else   

45     {    

46         printf("Not find pointer");    

47     }    

48 }
分享到:
评论

相关推荐

    二叉树最近最近公共祖先

    在二叉树中,最近公共祖先(最近共同祖先,LCA,Lowest Common Ancestor)是指两个节点在树中的最近的共同父节点。在某些应用场景,如文件系统或社交网络中,找到最近公共祖先具有重要意义。 针对给定的"二叉树最近...

    二叉树中最低公共祖先

    最低公共祖先问题是指给定两个节点,找到它们在二叉树中的最近公共祖先。这个公共祖先应当满足两个条件:一是它是两个给定节点的祖先,二是没有其他节点比它更接近这两个节点。这个问题在实际应用中很有价值,比如在...

    LCA.tar.zip_二叉树的最近公共祖先问题

    在计算机科学领域,二叉树的最近公共祖先(Lowest Common Ancestor,简称LCA)问题是一个经典的数据结构问题,特别是在图论和算法设计中。最近公共祖先指的是在一棵树中,两个节点的共同祖先中离叶子节点最远的一个...

    作业二叉树求最近公共祖先

    C语言所写源代码有注释,哈工大数据结构实验课自己所作,仅供参考

    python入门-leetcode面试题解之第236题二叉树的最近公共祖先.zip

    本资料包“python入门-leetcode面试题解之第236题二叉树的最近公共祖先.zip”正专注于这个方向,旨在帮助初学者解决LeetCode中的面试难题。 LeetCode是一个知名的在线平台,提供各种算法问题供用户练习和提高,它...

    二叉树的最近公共祖先1

    二叉树的最近公共祖先问题是一个经典的算法问题,主要涉及数据结构中的树和递归算法。给定一个二叉树和两个节点p和q,任务是找到这两个节点在树中的最近公共祖先。最近公共祖先(LCA)是指满足以下条件的节点x:x是p...

    二叉树的最近公共祖先II1

    在给定的问题中,我们被要求找到一个二叉树中两个特定节点的最近公共祖先(Lowest Common Ancestor,简称LCA)。这个问题是基于二叉树数据结构的一个经典问题,通常出现在算法面试或编程竞赛中,例如LeetCode的题目...

    MangoDowner#clear-leetcode#剑指Offer68-II.二叉树的最近公共祖先1

    剑指 Offer 68 - II. 二叉树的最近公共祖先原题链接:剑指 Offer 68 - II. 二叉树的最近公共祖先代码public TreeNode l

    面试题68 – II. 二叉树的最近公共祖先

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)” 例如,给定如下二叉树: root = [3...

    LebronAl#myLeetcodeDailyRecord#236_二叉树的最近公共祖先1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    floatLig#JavaLearning#236.二叉树的最近公共祖先1

    中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以

    二叉树中两结点最近的共同祖先算法

    在遍历过程中,我们记录每个节点的祖先节点,并计算两个节点的最近公共祖先。 算法优化 为了提高算法的效率,我们可以对算法进行优化。例如,我们可以使用哈希表来存储每个节点的祖先节点,以便快速查找两个节点的...

    Easay#JavascriptCoding#剑指68-2.二叉树的最近公共祖先1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    Cygra#Leet-Code-Solus#0236. 二叉树的最近公共祖先1

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节

    利用栈建立一个二叉树,然后用递归实现二叉树两个结点的最近公共祖先结点

    在利用栈建立一个二叉树的基础上,我们可以通过递归来实现二叉树中两个结点的最近公共祖先结点。递归是一种非常强大的算法技巧,它可以通过反复调用自身来解决问题。在这个特定的问题中,我们可以利用递归来查找两个...

    使用C语言求二叉树结点的最低公共祖先的方法

    在二叉树中,最低公共祖先(Lowest Common Ancestor, LCA)是指在树中同时是两个给定节点的最近的共同祖先。本篇主要介绍如何使用C语言求解二叉树节点的最低公共祖先,并结合ACM的练习题目进行深入解析。 首先,...

    数据结构求公共祖先

    求最近公共祖先的问题通常在二叉树中提出,目标是找到两个给定节点在树中最近的共同祖先。这个祖先应该满足两个条件:一是它是两个给定节点的祖先,二是所有满足这两个条件的节点中,它的深度是最小的。 解决这个...

    【POJ1330】最近公共祖先(LCA):并查集+深搜 - cxllyg的专栏 - 博客频道 - CSDN.NET1

    【最近公共祖先(LCA)问题详解】 最近公共祖先(Lowest Common Ancestor,简称LCA)是指在一颗树中,两个指定节点的最近的共同祖先。这个问题在计算机科学,尤其是数据结构和算法领域中非常常见,特别是在处理...

    python入门-leetcode面试题解之第235题二叉搜索树的最近公共祖先.zip

    最近公共祖先问题在二叉树中经常出现,尤其是在数据结构和算法面试中,因为它涉及到对树的遍历和理解。 第235题的题目大致是这样的:给定一个BST的根节点和两个不同的节点值,目标是找到这两个节点在树中的最近公共...

    Python《剑指offer》算法实现-二叉树的最低公共祖先

    # Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 ...6. 所需的素质:扎实的基础知识、能写高质量的代码、分析问题是思路清晰、能优化时间和空间效率、学习沟通能力

Global site tag (gtag.js) - Google Analytics