连接二叉树中同一级别的节点
connect nodes at same level of an binary tree
我看过一些关于如何连接同一级别的二叉树节点的文章/页面,但这些文章都没有清楚地解释过程/算法。如果有人能接手,我将不胜感激。代码不是必需的,但是用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;
}
有一种有趣的方法不使用额外的内存,这有点归纳:
-
第一级已经连接(它只有一个节点)
-
假设连接了电平
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()
现在,您将使每个节点与根节点保持距离,根据距离聚合每个节点,并可以根据您的要求加入节点。
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- 引擎节点:未定义的符号:_ZTV6Config
- 为什么"delete"关键字不删除节点?
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限