线索化二叉树及其遍历
线索化二叉树
以下是实现该结构并进行中序遍历的代码:
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




