概念:
对于二叉树而言,在一种遍历次序(前后中)里,每一个结点都有一个前驱和一个后继,这种信息叫做线索。一棵二叉树有 n+1个空链域(2n个链域,n-1个branch,2n-(n-1) = n+1 个空链域)。规定:如果一个结点的左儿子为空,就让左儿子的指针域存储前驱;如果右儿子为空,就让右儿子的指针域存储后继。具体是儿子还是线索,标个tag就行了。
遍历一棵普通二叉树,使其n+1个空链域存储线索的过程,叫做线索化,得到的二叉树叫做线索二叉树。
原因:
前后中序遍历线索二叉树的复杂度为O(n),因为借助于线索,算法的常数因子比普通二叉树遍历算法的常数因子小,而且不需要设栈。
遍历:
只需要找到序列中的第一个结点,依次找结点的后继直到后继为空就行了。逆序遍历的话,只要找到序列的最后一个结点,依次找结点的前驱就行了。然而,有一些结点它是有右儿子的,这样就存储不了后继线索了;有一些结点他是有左儿子的,这样就存储不了前驱线索了。怎么办?简单 ! --以当前结点为根,按遍历的性质来考虑。
下面的文字描述好像有点多,但是难以更简洁了!
(1)For 前序遍历:
后继:
如果它的