麒麟远创面试题3:二叉树中求两个节点的最低公共祖先节点

原创 2011年01月11日 20:54:00

题目要求:求二叉树中两个节点p,q的最低公共祖先节点

 

首先,题目中没有明确说明节点的结构,所以思考了一会然后问面试官节点有没有父指针,面试官说有没有父指针有影响吗?我说有,然后他笑着说你来说说看。当时,只做出来有父指针的情况,没有父指针的情况压根想不出来。后来会实验室静下心来很快就想到了思路。这里分这两种情况讨论:

 

1. 二叉树节点具有父指针

 

      在节点具有父指针的情况下,显然此二叉树就可以看成是通过父指针连接的"T"型链表,题目也就转化成查找"T"型链表的第一个公共节点。假设p,q分别为所求的两个节点,则通过遍历一遍可以知道p,q分别到根节点的长度pLen和qLen。这样就知道pLen和qLen之间长度之差,也就知道p、q到它们的第一个公共祖先节点k长度之差L。因为p,q到根节点的路径中都包含k到根节点的路径,所以pLen和qLen之差等于p、q到k的长度之差。然后,让p、q到根节点路径长度大的先向前走L,然后长度小再和大的同时向前遍历,当它们两指向同一个节点时,则那个节点即是所求。

2.二叉树节点不具有父指针

      这种情况下,必须通过遍历查找一个节点的祖先集合,然后比较两个节点的祖先集合就可以找到最低的那个。这里采用后序遍历,并传入一个栈记录该节点的祖先节点。在每次访问一个节点时,先把这个节点压入栈,然后判断该节点是不是要查找的那个节点,如果是返回。接着查找它的左子树和右子树,当要查找的节点在它的左右子树中则返回。然后判断该节点与栈顶节点是否相同,是则弹出栈顶元素。这是因为相同就代表了在访问它的左右子树时没有添加新的节点,也就是说要查找的那个节点不在它的左右子树中,则该节点也就是不是要查找的节点的祖先。

      在没有父指针时,还可以给每个节点添加一个计数器,在进入一个节点时加1,在退出该节点时减1。访问该节点时,如果要查找的节点在该节点的子树中,则返回。实际上,这和上面的算法思想是一样的,只是实现不同。

      这两种算法的时间复杂度都是O(n),效率不错。没有父指针的情况,空间复杂度也是O(n)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉树中两个节点的最近公共祖先节点

题目:求二叉树中两个节点的最近公共祖先节点 一、该二叉树为搜索二叉树 搜索二叉树的特点: 任意一个节点的左子树的所有节点值都比该节点的值小,其右子树的所有节点值都比该节点的值大。 解决该问题方法: 从...

二叉树(12)----查找两个节点最低祖先节点(或最近公共父节点等),递归和非递归

1、二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct...

(JDialog)对话框实现数据交换

      对话框分为模式对话框和无模式对话框。模式对话框就是在弹出对话框后,父组件阻塞直到完成对话框的操作,父组件被激活。无模式对话框就是对话框与父组件并行运行。         JDialog(D...

infQ——不受限于内存的队列

本文设计了一个不受限于内存的队列。目标是在保证性能的情况下,提供无限容量(受限于磁盘,代价很低),用于替换掉redis本身的list结构,避免在队列场景中,由于消费能力不够,导致的拥堵。...

求二叉树中两个节点的最低公共祖先节点

本篇博客接着写二叉树的面试题中:二叉树面试题(一)   二叉树面试题(二)   求树中两个节点的最低公共祖先节点 这个题可能有几种不同的条件,那这样就是不同的问题 (1) 树是二叉树,且是二叉搜索树。...

求二叉树中两个节点的最低公共祖先节点

直接贴代码 #include "stdafx.h" #include #include using namespace std; //定义二叉树的节点 struct BinaryTreeNode...

求二叉树中两个节点p,q的最低公共祖先节点

题目要求:求二叉树中两个节点p,q的最低公共祖先节点   首先,题目中没有明确说明节点的结构,所以思考了一会然后问面试官节点有没有父指针,面试官说有没有父指针有影响吗?我说有,然后他笑着说...
  • pi9nc
  • pi9nc
  • 2012年10月24日 15:14
  • 3555

面试题50:二叉树中两个节点的最低公共祖先

#include #include #include using namespace std; typedef struct BtNode { int value; struct Bt...

求二叉树的两个节点的最低公共祖先节点

这是一道很经典的问题,《剑指Offer》上给出的解法是先找到从根节点到这两个节点的简单路径,这两条简单路径的最后公共节点就是这两个节点的最低公共祖先节点。本文给出的解法不必找到从根节点到这两个节点的简...

求二叉树中两个节点的最低公共祖先

1、该树是一棵二叉搜索树 在二叉搜索树中,左子树的所有结点的值一定比根结点小,右子树中的所有结点的值一定比根结点大。根据二叉树的这个性质,我们只需要从根结点开始与两个输入结点的值进行比较,如果当前结...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:麒麟远创面试题3:二叉树中求两个节点的最低公共祖先节点
举报原因:
原因补充:

(最多只允许输入30个字)