一、线索二叉树
如果二叉树的节点包含数据域和两个指针域( lchild 和 rchild ),当节点没有下一个节点时,将指针域赋值为空(NULL),但有时会造成很大的浪费,所以可以将空指针域利用起来,存放其他节点的地址,这样就便于索引,像二叉树遍历,查找之类就会变得相对容易。
像上面的二叉树就会造成很大的浪费。当该二叉树以中序遍历输出时,为FDGBACE,红色表示有两个指针域可以利用,蓝色表示有一个指针域可以利用,而黑色表示没有多余的指针域可以利用,若果将一个节点的lchild(如果可以使用)指向它前一个节rchlid(如果可以使用)指向它的后一个节点(这里的前后是针对于FDGBACE这个序列而言的)。而假若在最前面增加一个头结点,数据域为data,那么会更加便捷。最终它们的指向会变为:
这样的对于中序遍历二叉树就会变得很容易。
然而,机器怎么判断一个节点到底有多少个指针域可以使用呢?这样就需要一个标志,指示该节点的两个指针域是否可以被利用,于是,我们把节点扩容,变为:
ltag为0时指向该结点的左孩子,为1时指向该结点的前驱。rtag为0时指向该结点的右孩子,为1时指向该结点的后继。
这样就能分别指示左右指针域是否可以利用。虽然牺牲了一点空间,但换来的是效率的提高。
二、代码实现
三、 效果展示