我们在二叉树上的先序、中序、后序遍历都是递归或者非递归完成的。
我们只能找到左、右孩子,而不能找到先、中、后序遍历序列下,元素的前驱和后继。
为此,我们可以设计线索二叉树,定义如下:
struct BiTreeThd { int data; bool lflag, rflag; struct BiTreeThd* lchild, *rchild; };
如上,多了lflag和rflag:
(1)当有左/右孩子的时候,lflag/rflag为0。此时lchild和rchild指向左孩子和右孩子。
(2)当没有左/右孩子的时候,lflag/rflag为1。此时lchild表示结点的前驱,而rchild表示结点的后继。
这里的前驱和后继,是相对于树的先、中、后序遍历而言的。
一句话:线索二叉树是为了在前、中、后序遍历时,能方便找到某个结点的前驱和后继。
树和 森林的遍历
To be continued.