连接二叉树中同一级别的节点

connect nodes at same level of an binary tree

本文关键字:一级 节点 二叉树 连接      更新时间:2023-10-16

我看过一些关于如何连接同一级别的二叉树节点的文章/页面,但这些文章都没有清楚地解释过程/算法。如果有人能接手,我将不胜感激。代码不是必需的,但是用pseudo来解释它会很好。

为了便于讨论,让我们将树视为:

0
1        2
3     4   5    6
7                      9

在上述情况下:

0 should point to null.
1 should point to 2.
3 should point to 4.
....
7 should point to 9.
9 should point to NULL.

基本树结构为:

class Tree {
public:
int data;
Tree* left;
Tree* right;
Tree* next;
}

有一种有趣的方法不使用额外的内存,这有点归纳:

  1. 第一级已经连接(它只有一个节点)

  2. 假设连接了电平i。然后,要连接级别i+1,请执行以下操作:

    a) 将节点lst(只是我们稍后将使用的中间变量)初始化为null

    b) 从级别i上的第一个节点开始。

    c) 从第一个节点开始遍历级别i上的节点。请注意,您可以轻松地遍历级别i上的节点,因为它已经连接,所以每个节点中都有同级指针。

    d) 对于级别i上的每个节点,首先查看其左侧子节点,然后查看其右侧子节点。对于每个不为null的子级,如果lst不是null,则将lst连接到该子级。然后将lst设置为该子级。

一旦连接到级别i + 1,就可以进入下一个级别。如果遍历级别lst后仍然为null,则表示该级别上没有节点有子级=>这是最后一个级别,则可以停止算法。

这很容易说明为什么它会起作用,它需要线性时间和恒定空间,所以它严格优于具有队列的BFS(需要线性内存)。

根据Ishamael的想法,我建议采用的方法

void link_levels(Tree* t){
Tree *head, *tail, *end_of_row;
assert (t != 0);
t->next = 0;
head = tail = end_of_row = t;
while(head != 0){
if(head->left != 0){
tail->next = head->left;
tail = tail->next;
tail->next = 0;
}
if(head->right != 0){
tail->next = head->right;
tail = tail->next;
tail->next = 0;
}
if(head == end_of_row){
head = head->next;
end_of_row->next = 0;
end_of_row = tail;
}
else {
head = head->next;
}
}
}

按照注释中的建议使用BFS。然后,您将获得每个节点与根的距离。

伪代码:

vis[1..n] = false   // mark each node as un-visited
dis[1..n] = 0
Queue q
dis[root] = 0 
vis[root] = true
q.push(root)
while !q.empty()
node x = q.front()
children[] = children nodes of node x
for each child in children 
!vis[child] 
dis[child] = dis[x] + 1 
vis[child] =true 
q.enqueue(child)
q.pop()

现在,您将使每个节点与根节点保持距离,根据距离聚合每个节点,并可以根据您的要求加入节点。