线索化二叉树及其遍历
线索化二叉树
以下是实现该结构并进行中序遍历的代码:
1 |
|
代码说明:
树的结构:
- 我们插入节点顺序为
5, 3, 8, 2, 4
,构造如下的树:1
2
3
4
55
/ \
3 8
/ \
2 4
- 我们插入节点顺序为
中序遍历顺序:
- 中序遍历的顺序是:先访问左子树,再访问根节点,最后访问右子树.
- 对于这棵树的中序遍历顺序是:
2 3 4 5 8
.
关键函数:
insert
:在二叉树中插入节点,同时维护线索化指针.leftmost
:寻找中序遍历中最左边的节点,作为遍历起点.inOrderTraversal
:通过线索化指针进行中序遍历.
输出结果:
运行此代码,输出将会是:
1 | 中序遍历: 2 3 4 5 8 |
线索化二叉树解释:
1. 初始状态:
我们创建了一个空的线索二叉树 root
,即 root = nullptr
.
2. 插入节点 5:
- 调用
insert(root, 5)
. - 因为
root
是nullptr
,直接返回新节点5
作为根节点.此时树结构如下:1
5
5
没有子节点,也没有线索.
3. 插入节点 3:
- 调用
insert(root, 3)
,即在节点5
的基础上插入. 3 < 5
,因此我们将其插入到5
的左子树中.- 节点
3
的右指针作为线索指向节点5
,此时树结构如下:1
2
3
4
55
/
3
\
5 (线索) 5
的左指针不再是线索,它现在有一个真正的左子树(节点3
).
4. 插入节点 8:
- 调用
insert(root, 8)
,即在当前树结构上插入. 8 > 5
,因此我们将其插入到节点5
的右子树中.- 节点
8
的左指针作为线索指向节点5
,此时树结构如下:1
2
3
4
5
65
/ \
3 8
\
5 (线索)
8 (线索) - 节点
5
的右指针现在指向真正的右子树(节点8
).
5. 插入节点 2:
- 调用
insert(root, 2)
,即在当前树结构上插入. 2 < 5
,继续向左走,2 < 3
,因此我们将其插入到节点3
的左子树中.- 节点
2
的右指针作为线索指向节点3
,此时树结构如下:1
2
3
4
5
6
75
/ \
3 8
/ \
2 5 (线索)
\
3 (线索) - 节点
3
的左指针不再是线索,它现在有一个真正的左子树(节点2
).
6. 插入节点 4:
- 调用
insert(root, 4)
,即在当前树结构上插入. 4 < 5
,继续向左走,4 > 3
,因此我们将其插入到节点3
的右子树中.- 节点
4
的右指针作为线索指向节点5
,此时树结构如下:1
2
3
4
5
6
7
85
/ \
3 8
/ \
2 4
\ \
3(线) 5 (线索)
7. 树的最终结构:
经过上述插入操作,最终树的结构如下:
1 | 5 |
- 左子树是:
3 -> 2, 3 -> 4
,并且线索指向相应的节点.
8. 中序遍历过程:
步骤 1:找到最左边的节点
- 调用
leftmost(root)
,找到树中最左边的节点,即2
.
步骤 2:遍历中序节点
- 当前节点是
2
,输出2
,然后查看2
的右指针,发现它是线索指向节点3
,因此移动到节点3
. - 当前节点是
3
,输出3
,然后查看3
的右指针,发现它指向节点4
,移动到节点4
. - 当前节点是
4
,输出4
,然后查看4
的右指针,发现它是线索,指向节点5
,移动到节点5
. - 当前节点是
5
,输出5
,然后查看5
的右指针,指向真正的右子树,找到最左边的节点8
. - 当前节点是
8
,输出8
,然后它没有右子树或线索,遍历结束.
9. 中序遍历输出:
最终中序遍历输出是:
1 | 2 3 4 5 8 |
这就是整个代码的运行过程和中序遍历结果.
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments