![d4c58e08d03da5ff80b056f12c1b8204.png](https://i-blog.csdnimg.cn/blog_migrate/4833d48cbfab582bb2209e03b30da381.png)
更新:
为了让文章篇幅不太长,我将指针的引用部分另外写成了一篇文章。
如果有需要,还请自行踱步。
Nice小夫:#图解 轻松看懂指针的引用*&zhuanlan.zhihu.com![8f5b221ec9ce097f4c4ed73585358368.png](https://i-blog.csdnimg.cn/blog_migrate/e261d6cc6d608fc9b9d2072558e01816.png)
什么是线索二叉树?
线索二叉树分为三类:
![55883eaf06e61824d5fe8c252048cc87.png](https://i-blog.csdnimg.cn/blog_migrate/3719a43d16dd6866d327d97125c69add.png)
对一棵二叉树中所有节点的空指针域按照某种遍历方式加线索的过程叫作线索化,被线索化了的二叉树称为线索二叉树。
为什么需要线索二叉树?
知道了“前驱”和“后继”信息,就可以把二叉树看作一个链表结构,从而可以像遍历链表那样来遍历二叉树,进而提高效率。
如何线索化二叉树
这里例举了中序线索二叉树的方法
一个二叉树通过如下的方法“串起来”:
所有原本为空的右(孩子)指针改为指向该节点在中序序列中的后继,所有原本为空的左(孩子)指针改为指向该节点的中序序列的前驱。
这句话我是借鉴了了另一位知友的总结,可以说是一看就懂了。
但我并不满足于此,我要让这句话更加直观展现出来。
![fa54562b5051d7516bc5a0a51de603ab.png](https://i-blog.csdnimg.cn/blog_migrate/31558e7f1f98c397a87a9769858807ff.jpeg)
我这个图这样直观展示,是有意为之的。
让你看到左孩子空,就会想到直接前驱。右孩子空,就会想到直接后继。
线索二叉树的结构
![daa5690e90c782bcd4bd8466e536a70b.png](https://i-blog.csdnimg.cn/blog_migrate/2b6a7cd392e380c2eeaaf82528b7f623.png)
标识域:
- 如果ltag=0,表示指向节点的左孩子。如果ltag=1,则表示lchild为线索,指向节点的直接前驱
- 如果rtag=0,表示指向节点的右孩子。如果rtag=1,则表示rchild为线索,指向节点的直接后继
什么是前驱后继,不需要我解释了吧。
所以对应的线索二叉树的节点定义如下:
typedef
![ebd60057f46d9657a3ad2f938fbcc6ba.png](https://i-blog.csdnimg.cn/blog_migrate/b51f672e8bcb58f5a19582a16694bc75.jpeg)
![aeb1141e1e1da703af4cbcfbce00e54f.png](https://i-blog.csdnimg.cn/blog_migrate/708ca3a01d533a4b06a85d86ee8608c2.jpeg)
我们心目中的代码就是要将中序线索二叉树用二叉链表来实现。
我们来一步一步的书写代码:
约定:
- 指针p指向当前正在访问的节点
- pre指向p的前驱节点
// 通过中序遍历对二叉树线索化的递归算法:
通过中遍历建立中序线索二叉树的主要程序
// 通过中遍历建立中序线索二叉树的主要程序
遍历中序线索二叉树
求以p为根的中序线索二叉树中,中序序列下的第一个节点。
TBNode
求在中序线索二叉树中,节点p在中序下的后继节点。
TBNode
中序线索二叉树上执行中序遍历的算法
void
剩下的前序线索二叉树遍历和后序线索二叉树,套路还不是一样一样的?
我的更多图解教程:
Nice小夫:#图解 数据结构:树的存储结构zhuanlan.zhihu.com![4809bf25f793a6ac00175746e72696e9.png](https://i-blog.csdnimg.cn/blog_migrate/f55739119d353504b7dd644ab6aa3350.png)
![43376731d428f377752dc960d7cea027.png](https://i-blog.csdnimg.cn/blog_migrate/fb21766d36452fc1f2e0bc06b51479df.jpeg)
![3d37b474f14a6f06f5a46f3d1b7a6929.png](https://i-blog.csdnimg.cn/blog_migrate/304fbc44e46f3785d49501fb803d7c67.png)
![4d1ea89dd0b8ce996df3f5f1c02ad44c.png](https://i-blog.csdnimg.cn/blog_migrate/edd65027c9562418a5573b67ffaffd0c.png)
![081c89d1458d852eaef4db507c0dd0d4.png](https://i-blog.csdnimg.cn/blog_migrate/8f7a9a2ea5cf540f0ef9b3191f9c817a.png)
![fde9bca0a4d4e217b131a44af7d1fc76.png](https://i-blog.csdnimg.cn/blog_migrate/c27610c222a51189d4dd42d7b8f3e509.png)
![60ff3db36066908c4401e96e6beffbde.png](https://i-blog.csdnimg.cn/blog_migrate/79fbb66a011a2ab46f6056b96a619c77.png)
![dd4c2f49107de60b1ffb9819bfee3bee.png](https://i-blog.csdnimg.cn/blog_migrate/854634aa70e94286bc78e1d173e6195a.png)
Nice!Nice!Nice!
明白啦。
![4ac1c6ac73e4f27d4603d8ace7afdb53.png](https://i-blog.csdnimg.cn/blog_migrate/fc04994a0d9e86d9c45d433358c14b46.png)