如上图所示,在二叉树中,每一个结点都包含三个基本信息:结点自身的数据信息,结点指向左子节点和右子节点的指针。
然而从空间利用率上说,对于非满二叉树,我们发现经常会有结点空指针的情况出现,造成大量的空间浪费,为了更高效地利用空间,提高运行效率,我们针对二叉树进行改进,提出了线索二叉树,即二叉树的线索化。
图中为一个二叉树,其中用红色圆圈标注出来的都是结点的空指针
线索二叉树的改进原理与方法
通过比较前序遍历、中序遍历和后续遍历,我们发现当采用中序遍历时,含有空指针的结点往往均匀间隔存在,下图形象表明这一现象。
红色字体表示含有空指针的结点,绿色表示完全利用了度为2的结点,即绿色结点是空间利用良好的结点,而红色表示空间利用不足尚待改进的结点。根据排布特点,我们可以考虑将空指针用于指向它前后的两个结点,即前驱和后继节点。
/
(了解的话此处可跳过)何为前驱和后继?
前驱结点:在中序遍历(二叉查找树的中序遍历即为从小到大的排序)的上一个结点,就是比这个数小的最大的数。
后继结点:在中序遍历的下一个点,就是比这个数大的最小的数。
例:上图中,对于D结点,H为D的前驱结点,I为D的后继节点。
/
但这是最理想的情况,有时候排布并不是如何恰到好处,例如:
在该图中,红色的表示含有两个空指针的结点,黄色的表示含有一个空指针的结点,故我们需要告诉计算机何时该指针指向子节点,何时该指针应该指向前驱/后继。
*
解决方案:
在lchild-data-rchild的结点结构基础上进行扩充,增加一个标识器tag来表示该处的指针的用途是指向子节点或前驱/后继,如tag=0,则指向子节点,如tag=1,则指向前驱/后继,这样就可以告诉计算机每个节点的指针应该如何利用。
以上就是线索二叉树的原理。