树的线索遍历

树的线索遍历(基本原理描述,无代码实现)

树的线索遍历包括前序,中序,后序三种线索遍历方式。

线索二叉树的数据结构

图一

ltag=0: lchild指示结点的左孩子。

ltag=1:lchild指示结点的前驱。

rtag=0: rchild指示结点的右孩子。

rtag=1:rchild指示结点的后继。

前序线索遍历(根左右)

线索遍历即找其前驱和后继。

给一个前序线索二叉树,如何根据该树找到当前节点通过前序遍历的前驱和后继。

前驱

根据二叉树的结构 当一个结点

ltag=1时 该结点的前驱为lchild所指向的位置。

但当ltag=0时该结点的前驱是谁呢?

例如
图二
图片转自:

对于H结点 该结点的前驱为D(双亲),而I结点的前驱为H(兄弟结点)

观察可知H为其双亲的左孩子结点,I结点为其双亲的右孩子结点。

所以当ltag=0时

(1)若当前结点为其双亲结点的左孩子结点,则该结点的前驱为其双亲结点

(2)若当前结点为其双亲节点的右孩子结点,如果该节点有兄弟结点,则该结点的前驱为以其兄弟结点为根节点的二叉树最后遍历的结点(该树的最右侧叶子结点)

(3)若当前结点为二叉树的根结点,其前驱为空。

后继

对于前序遍历来说,其后继的寻找是一个非常简单的事情。

当rtag=1时 后继结点为lchild指向的结点。

rtag=0时 若其左孩子存在后继结点为其左孩子,否则为其右孩子(两个孩子均不存在的情况不可能出现,因为若其右孩子不存在则rtag=1,不符合当前情况)

中序线索遍历(左根右)

图三
图片转自:

前驱

ltag=1时:lchild指向结点为其前驱

ltag=0时:前驱为遍历左子树时最后一访问的一个结点(左子树中最右下结点)

后继

rtag=1时:rchild指向为其后继

rtag=0时:结点的后继为遍历右子树时访问的第一个结点(右子树中最左下结点)

后序线索遍历(左右根)

图四
图片转自:

遍历顺序为H,I,D,E,B,F,G,C,A

前驱

ltag=1时 lchild指向的结点即为前驱

ltag=0时 当右孩子存在时前驱结点为其右孩子结点

​例如:

图五

​ 当右孩子节点不存在时其前驱结点为左孩子结点(左孩子结点一定存在 因为此时ltag=0)
例如:

图六

​ (图六)

后继

rtag=1时 其指向结点为后继结点

rtag=0时 (1)若为二叉树的根结点则后继结点为空(如图四中的A结点)

​ (2)若当前结点为双亲的右孩子结点或者是双亲的左孩子且其双亲没有右子树,则其后继结点为其双亲结点(如图五和图六 中的B结点)

0时 (1)若为二叉树的根结点则后继结点为空(如图四中的A结点)

​ (2)若当前结点为双亲的右孩子结点或者是双亲的左孩子且其双亲没有右子树,则其后继结点为其双亲结点(如图五和图六 中的B结点)

​ (3)若当前节点是其双亲的左孩子,且其双亲有右子树,则其后继结点为双亲的右子树上按后序遍历列出的第一个结点(如图四中的B结点)

猜你喜欢

转载自blog.csdn.net/pangduhu/article/details/113771775