遍歷二叉樹就是以一定的規則將二叉樹中的結點排列成乙個線性序列,從而得到二叉樹結點的各種遍歷序列。其實質就是對乙個非線性結構進行線性化操作,使在這個訪問序列中每乙個結點(除了第乙個和最後乙個)都有乙個直接前驅和直接後繼。
在二叉樹的鏈式儲存中,只能體現出父子關係,不能直接得到結點在遍歷中的前驅和後繼。前邊提到,在有n個結點的二叉樹中,有n+1個空指標域,如果利用這些空指標域存放指向其前驅或者後繼的位址,那麼就可以方便的運用某些二叉樹操作演算法。這些指標就是線索,引入線索二叉樹就是為了加快查詢結點前驅和後繼的速度。
線索二叉樹的結點結構如下:
儲存結構如下:
typedef struct threadnodethreadnode,*threadtree;
上面說的前驅和後繼,樹**有前驅和後繼?這裡的前驅和後繼是相對於遍歷說的。二叉樹先序遍歷、中序遍歷、後序遍歷得到乙個線性序列,所以二叉線索樹就可以分為中序線索二叉樹、先序線索二叉樹和後序線索二叉樹。
主要程式如下:
#include #include typedef char elemtype; /*
線索儲存標誌位
link(0):表示指向左右孩子的指標
thread(1):表示指向前驅後繼的線索
*/typedef enum pointertag;
typedef struct bithrnodebithrnode, *bithrtree;
//全域性變數,始終指向剛剛訪問過的節點
bithrtree pre;
//建立一棵二叉樹,約定使用者遵照前序遍歷方式輸入資料
void createbithrtree(bithrtree *t)else}
//中序遍歷線索化
void inthreading(bithrtree t)
if(pre!=null && !pre->rchild)
pre = t;
inthreading(t->rchild);//遞迴右孩子線索華
}} //中序遍歷線索二叉樹---非遞迴
void inorderthreading(bithrtree t)
printf("%c ", p->data);
while(p->rtag == thread && p->rchild != null)
p = p->rchild;
} }int main()
二叉樹的中序線索樹 資料結構 線索二叉樹
1.引入線索二叉樹 二叉樹的遍歷實質上是對乙個非線性結構實現線性化的過程,使每乙個節點 除第乙個和最後乙個外 在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存結構中,只能找到乙個節點的左 右孩子資訊,而不能直接得到節點在任一遍歷序列中的前驅和後繼資訊。這些資訊只有在遍歷的動態過程中才...
樹和二叉樹 森林 線索二叉樹
1 三叉鍊錶 在二叉鍊錶的基礎上增加了乙個指向雙親的指標域。2 三叉鍊錶的結點資料型別宣告 templatestruct node 3 樹 二叉樹 1.兄弟加線。2.保留雙親與第一孩子連線,刪去與其他孩子的連線。3.順時針轉動,使之層次分明。樹的前序遍歷等價於二叉樹的前序遍歷!樹的後序遍歷等價於二叉...
線索二叉樹 資料結構
按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...