线索二叉树的个人理解

中序线索二叉树的构造

对于每个结点o而言,重新定义其左、右儿子指针lson,rson:

  • 左儿子指针lson:
    • Case 1:若o存在左儿子,则lson仍指向其左儿子,o->ltag=0(此时o的中序前驱应为o的左子树中序遍历的最后一个结点,也就是o的左子树最右下那个结点)
    • Case 2:若o不存在左儿子,则lson指向其在中序遍历序列中的前驱,o->ltag=1
  • 右儿子指针rson:
    • Case 1:若o存在右儿子,则rson仍指向其右儿子,o->rtag=0(此时o的中序后继应为o的右子树下的最左下方结点)
    • Case 2:若o不存在右儿子,则rson指向其在中序遍历序列中的后继,o->rtag=1

中序线索二叉树的遍历

假设当前访问节点o及其子树:

Step 1: 子树o的中序遍历中,第一个遍历到的,显然是o最左下方的结点。因此首先不断沿左儿子指针走,走到子树o下的最左下方结点p处。

Step 2: 访问子树o中最左下方结点后,下一步,应访问其中序后继结点

  • Case 1:若p无右儿子,则应向上走返回,而返回过程中,所有无右儿子的祖先结点,都已访问过左子树了
    • (i)此时应沿着p的后继线索不断访问后继结点,直至找到一个有右儿子的后继结点p'。
    • (ii)中序遍历p'的右子树,o<=p', Goto Step 1
  • Case 2:若p有右儿子,则下一步应中序遍历p的右子树,o<=p->rson,Goto Step 1

查找中序线索二叉树结点o的前驱

  • Case 1. o有左儿子,则o的前驱为其左子树下最右下的那个结点,从o的左儿子出发,不断沿右儿子指针(rtag=0)走,即可找到o的前驱

  • Case 2. o没有左儿子,则o的前驱为o的前驱指针指向的结点

参考文献:

[1]waret.线索二叉树的及其遍历问题 .http://waret.iteye.com/blog/709779

猜你喜欢

转载自www.cnblogs.com/qpswwww/p/9940676.html