首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

迅雷面试题-一颗二叉树,怀疑有一些结点有不止一个父结点,编程找寻当前结点的所有父结点

2012-09-28 
迅雷面试题--一颗二叉树,怀疑有一些结点有不止一个父结点,编程寻找当前结点的所有父结点一棵二叉树节点的

迅雷面试题--一颗二叉树,怀疑有一些结点有不止一个父结点,编程寻找当前结点的所有父结点
一棵二叉树节点的定义(和平时我们定义的一样的) 它给出了一棵二叉树的根节点 说现在怀疑这棵二叉树有问题 其中可能存在某些节点不只有一个父亲节点 现要你编写一个函数判断给定的二叉树是否存在这样的节点 存在则打印出其父亲节点返回true 否则返回false
打印节点形式:
[当前节点][父亲节点1][父亲节点的父亲节点][。。。]
[当前节点][父亲节点2][父亲节点的父亲节点][。。。]

我想到一个方法,遍历二叉树,对每个结点,用一个链表记录父结点指针,把 <结点指针,父结点指针链表>作为键值对 存在哈希表。遍历完后,再遍历哈希表,若一个结点有多个父结点,则输出。
时间复杂度和空间复杂度都是O(N)

应该还有更好的方法吧?

坐等高人回答!!!!

[解决办法]
其实lz的方法已经不错了,时间复杂度必须是线性的这个应该不能再提高了,还有就是我觉得这个二叉树的key也许不是唯一的(可以重复)但是他们的地址应该是独一无二的的标志了,那么还不如把所有的孩子的地址都放在在一个数组里,如果存在两个节点的同一个双亲那么在遍历树的时候,那个有多个父亲的孩子节点就会被计算两次的。这样就会在数组之中存在相同的两个数。接下来就转化成了经常会看的的一类问题,在一组数据之中判断是否有重复的数据并将其查找出来。
如果这道题允许我将这个棵树的有多个父亲的节点纠正,去点一个父亲的话我向下面的方法还是可以考虑的:
1.将这个二叉树翻转(将指向孩子的指针指向父亲),并且记录所有的叶子节点
2.在利用步骤一中记录的叶子节点,再将这颗翻转的树再次翻转过来,这样就去除了多父节点
要知道这颗二叉树是不是存在多父节点的节点,只需要在两次翻转的时候记录节点的总数即可。
[解决办法]
这里的树会不会出现环啊,如果出现环了的话就不奏效了
[解决办法]
遍历每个节点是必须的,线性复杂度已经是最好的了。

热点排行