2014-10-31 89 views
0

这是一个采访问题: 给定二叉树的节点'k',找到它的所有兄弟和表兄弟。没有可用于节点的nextPointer查找给定节点级别的所有节点

考辛斯:在相同的水平给定节点“K”排除“K”

的兄弟我知道答案,可以找到的水平,在其中,k谎言(第1次),然后打印所有节点该级别的节点(第2遍)(使用级别遍历)。但是,这将是一个2遍算法。任何人都可以为它提出一个通过或更有效的算法。

实施例:

 15 
    /\ 
    18 19 
/\ /\ 
    2 3 4 5 
/\//\ 
1 6 7 8 9 

Input: k=6 
Output: 1,7,8,9 
+0

“更高效”是什么意思?就时间复杂度而言,该算法是最优的,因为它具有'O(n)'时间复杂度(在最坏的情况下输出大小为'O(n)')。 – kraskevich 2014-10-31 17:40:05

+0

您可以通过在当前级别形成所有条目的列表/集合,并查看其中是否包含“k”来进行单个级别遍历:只筛选出它的兄弟(s)报告表兄弟可能需要保留一些额外的元数据,尽管...... – twalberg 2014-10-31 17:59:38

回答

0

的算法的概要是使用改性BFS:

  1. 设置一个队列为空
  2. 设置一个布尔 '发现' 为假。
  3. 排队根。
  4. 入队一个空占位符。
  5. 对于队列中的每个元素,直到占位符排入子元素。排队时,如果数字与输入值匹配,则将'found'设置为true。
  6. 将空占位符从前面移到队列后面。
  7. 如果发现是错误,则继续5.
  8. 如果找到是true,则打印排除该值的队列。

这将在一次通过。

0

使用BFS以级别顺序打印树,然后使用给定节点检查每个级别。时间复杂度是O(n)。

相关问题