线索二叉树
遍历二叉树,实质上是对一个非线性结构进行线性化操作,使得每个节点在这些线性序列中有且仅有一个直接前驱和直接后驱。
线索:指向前驱或后继节点的指针被称为线索。
线索二叉树:加上线索的二叉链表就叫做线索二叉树。
实现
有n个节点的二叉链表必定有n+1个空链域。
推导过程是这样的:
一个拥有n个节点的二叉树,必定有2n个指针域,也一定有n-1个分支,那么 2n - (n - 1) 就是空指针域的数量,即:n + 1
在线索二叉树的节点中增加两个标志域
LTag = 0 时 lchild域指示节点的左孩子
= 1 时 lchild域指示节点的前驱
RTag = 0 时 rchild域指示节点的右孩子
= 1 时 rchild域指示节点的后继
线索二叉树遍历方法:
在线索树上进行遍历,只要先找到序列中的第一个节点,然后依次找节点后继直至其后继为空为止。
当一个二叉树有了线索之后,就不需要栈信息。对于非叶子节点,也就是分支节点来说,前驱就是其左子树最后访问到的数据,后继是右子树最先访问到的一个元素。(中序线索链表)
线索二叉树优点:
在中序线索二叉树上遍历二叉树,虽然时间复杂度同样也是O(n),但常数因子要小一些,而且不需要设栈。因此,若在某程序中所用二叉树需要经常遍历或查找节点在遍历说的先行序列中的前驱和后驱,则应采用线索链表做存储结构。
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog