1. 程式人生 > >線索二叉樹的個人理解

線索二叉樹的個人理解

中序線索二叉樹的構造

對於每個結點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