链接二叉树中相同深度的节点

时间:2015-04-05 16:00:13

标签: algorithm tree

您将获得一个Node

public class Node {
    Node left;
    Node right;
    Node next;
}

现在给定一个节点作为二叉树的根(它不是一个完整的二叉树,某个节点只有左或右子节点),你需要为所有{{1}设置next字段树中的s,以便相同深度的所有Node从左到右连接在一个链表中。

并且你不应该使用线性数量的附加内存,例如用其深度注释每个节点。这意味着类Node中没有int depth之类的额外字段或类似的意图,例如地图Node

如果我可以设置节点深度并在树上进行BFS遍历,我可以轻松解决这个问题。当我有当前节点和前一个节点处于相同深度时,我为前一个节点设置了Map<Node, Integer>

但是,面试官要求我不要注释每个节点的深度。 请帮我解决这个问题。谢谢。如果非注释解决方案的运行时间仍为next,请告诉我。

1 个答案:

答案 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

这实质上是从左到右穿过整个树传播。