您将获得一个Node
类public class Node {
Node left;
Node right;
Node next;
}
现在给定一个节点作为二叉树的根(它不是一个完整的二叉树,某个节点只有左或右子节点),你需要为所有{{1}设置next
字段树中的s,以便相同深度的所有Node
从左到右连接在一个链表中。
并且你不应该使用线性数量的附加内存,例如用其深度注释每个节点。这意味着类Node
中没有int depth
之类的额外字段或类似的意图,例如地图Node
。
如果我可以设置节点深度并在树上进行BFS遍历,我可以轻松解决这个问题。当我有当前节点和前一个节点处于相同深度时,我为前一个节点设置了Map<Node, Integer>
。
但是,面试官要求我不要注释每个节点的深度。
请帮我解决这个问题。谢谢。如果非注释解决方案的运行时间仍为next
,请告诉我。
答案 0 :(得分:1)
我假设您知道树的高度h
(可以在O(n)
时间和日志空间中计算。通过维护所有h
列表的尾部,您可以使用DFS生成列表。您只需要存储h
尾部元素和调用堆栈参数(O(log n)
额外空间):
初始化:
listTails := array with h null entries (type Node)
n := root
depth := 0
并致电:
function buildLists(Node n, int depth, Node[] listTails)
{
if(n == null)
return;
if(listTails[depth] != null)
listTails[depth].next = n;
listTails[depth] = n;
buildLists(n.left, depth + 1, listTails);
buildLists(n.right, depth + 1, listTails);
}
如果对列表尾部使用动态大小的数据存储(例如C ++中的std::vector<>
),则甚至不必事先知道h
。
这实质上是从左到右穿过整个树传播。