4.4 尋找先序後繼
4.5 先序遍歷
4.6 main函式
4.7 測試
5.小結
#include
#include
#define elemtype char
//線索二叉樹結點型別定義
typedef struct threadnode threadnode,
* threadtree;
/*函式宣告*/
void
createthtree
(threadtree&t)
;//1.先序建立線索二叉樹
void
initthread
(threadtree&t)
;//2.初始化tag
void
visit1
(threadnode* q)
;//3-1.訪問並建立線索
void
prethread
(threadtree t);
//3-2.遍歷
void
createprethread
(threadtree t);
//3-3.先序線索化主過程
threadnode*
nextnode
(threadnode* p)
;//4.找到p的後繼結點
void
visit2
(threadnode* p)
;//5-1.列印結點
void
preorder
(threadnode*t)
;//5-2.利用先序後繼實現先序遍歷
/*1.先序建立線索二叉樹*/
void
createthtree
(threadtree&t)
}
/*2.初始化tag*/
void
initthread
(threadtree&t)
}
threadnode* pre =
null
;//pre指向當前訪問結點的前驅
//3-1.訪問並建立線索
void
visit1
(threadnode* q)
if(pre !=
null
&& pre-
>rchild ==
null
) pre = q;
//標記當前結點為剛剛訪問過的結點
}
//3-2.遍歷
void
prethread
(threadtree t
)}
//3-3.主過程
void
createprethread
(threadtree t
)}
/*4.尋找先序後繼*/
threadnode*
nextnode
(threadnode* p)
else
return p-
>rchild;
//若rtag=1,說明所找結點無右孩子,則返回後繼線索
}
//5-1.列印結點
void
visit2
(threadnode* p)
//5-2.利用先序後繼實現先序遍歷:空間複雜度為o(1)
注意轉圈問題
在先序線索化二叉樹時,要注意條件的判斷,由於先序遍歷的順序為根->左->右,因此對於最先進行的是根結點線索化,讓其左指標指向前驅,這時繼續訪問左孩子將會出現"轉圈"現象,處理方法是判斷當前處理結點是否被線索化,若已被線索化,則跳過。同樣的,如果左子樹沒有問題,右子樹是最後被訪問的,在訪問完最後一層的左子樹後該遞迴訪問每一層的右子樹,但後一層結點本來為空的右孩子指標在前面的訪問中已經指向了其後繼結點,也會出現"轉圈"現象,處理方法同左子樹。
關於先序前驅
上述**只實現了找先序後繼的操作,那為什麼沒實現找先序前驅的操作呢?不妨我們先來**為什麼中序遍歷中既可以找到中序前驅,又可以找到中序後繼呢?
對於先序線索二叉樹來說,根據先序遍歷的順序根->左->右,對每個結點來說,他自己都是最先被訪問的,然後再訪問其左右孩子,即其左右孩子永遠都只可能是他的後繼,所以普通方法是找不到先序的前驅的。
可行的解決辦法有兩種:一種是從頭遍歷找到指定結點的前驅,效率較為低下;另一種可以將二叉鍊錶改為三叉鍊錶,給各個結點設定乙個指向其父節點的指標,然後再根據不同的情況討論其前驅,這裡不再展開。
資料結構 線索二叉樹的線索化(中序 先序 後序)
線索二叉樹 include include typedef struct threadnodethreadnode,threadtree threadnode pre null 定義全域性變數pre,指向當前訪問結點的前驅 threadtree createthreadtree threadtree...
二叉樹的中序線索樹 資料結構 線索二叉樹
1.引入線索二叉樹 二叉樹的遍歷實質上是對乙個非線性結構實現線性化的過程,使每乙個節點 除第乙個和最後乙個外 在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存結構中,只能找到乙個節點的左 右孩子資訊,而不能直接得到節點在任一遍歷序列中的前驅和後繼資訊。這些資訊只有在遍歷的動態過程中才...
資料結構 中序線索二叉樹
所謂線索二叉樹無非是為了讓原本指向null的節點指向乙個詳細的 已經存在的節點,邏輯上實現指標的無空指向的實現。以下是我中 序線索二叉樹的實現。還是把先序線索二叉樹與後序線索分開來寫吧。include using namespace std template struct node template...