`
ouqi
  • 浏览: 42167 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

[转载]程序员面试100题之十六:二叉树中两个节点的最近公共父节点

阅读更多

本文转载自 http://blog.csdn.net/hackbuteer1/article/details/8022138

 

这个问题可以分为三种情况来考虑:
情况一:root未知,但是每个节点都有parent指针
此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个方法很简单,不需要详细解释的。

情况二:节点只有左、右指针,没有parent指针,root已知
思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最近公共父节点;
二是两个节点在同一侧,则 root->left 或者 root->right 为 NULL,另一边返回a或者b。那么另一边返回的就是他们的最小公共父节点。
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回。

[cpp] view plaincopy
 
  1. // 二叉树结点的描述    
  2. typedef struct BiTNode    
  3. {    
  4.     char data;    
  5.     struct BiTNode *lchild, *rchild;      // 左右孩子    
  6. }BinaryTreeNode;   
  7.   
  8. // 节点只有左指针、右指针,没有parent指针,root已知  
  9. BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)  
  10. {  
  11.     if(root == NULL)  
  12.         return NULL;  
  13.     if(root == a || root == b)  
  14.         return root;  
  15.     BinaryTreeNode* left = findLowestCommonAncestor(root->lchild , a , b);  
  16.     BinaryTreeNode* right = findLowestCommonAncestor(root->rchild , a , b);  
  17.     if(left && right)  
  18.         return root;  
  19.     return left ? left : right;  
  20. }  


情况三: 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知

[cpp] view plaincopy
 
  1. // 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知  
  2. BinaryTreeNode* findLowestCommonAncestor(BinaryTreeNode* root , BinaryTreeNode* a , BinaryTreeNode* b)  
  3. {  
  4.     char min  , max;  
  5.     if(a->data < b->data)  
  6.         min = a->data , max = b->data;  
  7.     else  
  8.         min = b->data , max = a->data;  
  9.     while(root)  
  10.     {  
  11.         if(root->data >= min && root->data <= max)  
  12.             return root;  
  13.         else if(root->data < min && root->data < max)  
  14.             root = root->rchild;  
  15.         else  
  16.             root = root->lchild;  
  17.     }  
  18.     return NULL;  
  19. }  
分享到:
评论

相关推荐

    程序员面试100题

    二元查找树是一种特殊的二叉树,其中每个节点的值都大于其左子树中任何节点的值,小于其右子树中任何节点的值。这种特性使得在树中查找、插入和删除操作的时间复杂度可以达到O(log n)。 2. **排序的双向链表** ...

    程序员面试100题含数据结构

    ### 知识点详解:“程序员面试100题含数据结构”之二叉查找树转换为排序双向链表 在IT领域,特别是软件开发行业中,面试官常常会通过一系列问题来评估应聘者的算法和数据结构知识。其中,“程序员面试100题含数据...

    程序员面试题精选100题完整版

    在软件开发行业中,数据结构与算法是程序员必须掌握的基础技能之一,尤其是在求职过程中,这部分知识更是考察的重点。其中,二叉查找树(Binary Search Tree, BST)作为一种重要的数据结构,因其高效的查找特性而在...

    程序员面试题精选100题.pdf

    在程序员的面试过程中,面试题往往涵盖了许多技术领域,包括数据结构、算法、操作系统、网络、数据库等。这里我们重点讨论的是如何将一个二元查找树(Binary Search Tree, BST)转换成一个排序的双向链表,这是一个...

    程序员面试精选100题.pdf

    **二叉查找树(Binary Search Tree,简称BST)**是一种特殊的二叉树数据结构,在这种结构中,每个节点包含一个键值或记录,具有以下特点: 1. **左子树**中的所有节点的键值均小于其父节点的键值; 2. **右子树**中的...

    二叉树 基本操作(面试)

    8. 二叉树的直径:找到二叉树中最远的两个节点之间的路径长度。 以上就是二叉树的基本操作和面试中常见的问题。熟练掌握这些知识,不仅能够提升编程能力,也能在面试中展现出深厚的基础。通过不断练习和实践,我们...

    常见的二叉树面试题大汇总(涵盖二叉搜索树)

    10. 二叉树的直径:找到树中最远两个节点之间的路径长度。 四、解题策略 1. 画图理解:对于复杂的二叉树问题,画出示意图有助于理解问题并找到解决方案。 2. 动态规划:对于涉及多步决策的问题,动态规划可以有效...

    程序员面试题精选100题.doc

    - **二元查找树**:一种特殊的二叉树,其中每个节点的值都大于其左子树中的任意节点的值,并且小于其右子树中的任意节点的值。 - **双向链表**:每个节点包含两个指针,分别指向它的前驱节点和后继节点,允许双向...

    程序员面试题精选(附答案及分析)

    双向链表则是一种线性数据结构,其中每个节点都有两个指针,分别指向其前一个节点和后一个节点,使得可以从任意位置双向遍历链表。 题目描述的转换要求不创建新节点,只调整原有节点的指针,最终形成一个排序的双向...

    python-leetcode面试题解之第145题二叉树的后序遍历-题解.zip

    二叉树是一种数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。后序遍历是一种遍历或访问二叉树所有节点的方法,顺序是:左子树 → 右子树 → 根节点。这种遍历方式常用于计算表达式树、复制复杂的...

    python程序员面试(算法完整)

    - **找出排序二叉树上任意两个结点的最近公共父结点**: 通过自顶向下的搜索方式找到这两个结点的最近公共祖先。 - **复制二叉树**: 通过深度优先搜索的方式,创建新的节点并建立相同的连接关系。 以上就是针对...

    程序员面试题精选解答

    - 二元查找树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点的值,并且小于其右子树中的任何节点的值。 - **特点:** - 二元查找树的中序遍历结果是升序序列。 - 由于二元查找树具有上述性质,...

    程序员面试选精选.doc

    在程序员面试中,经常会遇到各种数据结构和算法的问题,这有助于评估候选人的逻辑思维、问题解决能力和编程技巧。本题“把二元查找树转变成排序的双向链表”是一道典型的数据结构转换问题,主要涉及到二元查找树...

    Java版-剑指offer

    寻找二叉树中给定节点的下一个节点,通常需要考虑当前节点的右子节点或其父节点的左子节点。 题目11:对称二叉树 此题检查一棵二叉树是否对称,可以通过递归比较左右子树的镜像关系来解决。 题目12:连续子数组的...

    非递归前序,中序,后序遍历二叉树(优化算法).rar_nooneyh_二叉树 非递归_前序 中序 后序_树遍历算法_遍历二叉树

    在计算机科学领域,二叉树是一种基础数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。遍历二叉树是指按照特定的顺序访问树中的每一个节点,常见的遍历方法有三种:前序遍历、中序...

    数据结构算法设计笔试面试题5.docx

    描述中提到这是一个程序员面试题集中的问题,强调了在竞争激烈的就业市场中,面试和准备的重要性。作者分享了自己的经验,并希望通过收集和整理面试题来帮助应聘者准备面试,尤其是技术类面试。题目要求不创建新节点...

    二叉树遍历

    二叉树遍历是计算机科学中一种重要的数据结构操作,主要应用于...在面试或者实际工作中,二叉树遍历的掌握程度往往被视为衡量一个程序员能力的重要标准之一。因此,对二叉树遍历的熟练掌握是每个IT专业人士的必备技能。

    数据结构面试大全.rar

    二叉树是最常见的树类型,其中每个节点最多有两个子节点。二叉搜索树是一种特殊的二叉树,左子树上的所有节点小于父节点,右子树上的所有节点大于父节点。 7. **图**:图由节点(顶点)和边组成,可以表示复杂的...

Global site tag (gtag.js) - Google Analytics