線索二叉樹的個人理解
阿新 • • 發佈:2018-11-10
中序線索二叉樹的構造
對於每個結點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 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