線索二叉樹的定義:還是按照鏈二叉樹的方法建立,只不過在結點原本為空的左指標改為指向該結點在中序遍歷中的前驅,結點原本為空的右指標改為指向該結點在中序遍歷中的後繼,也就是說把空的指標給利用了起來。
1.定義結構體
與鏈二叉樹不同的是結點增加了兩個資料,判斷指標下乙個連線的是樹還是線索
typedef enumpointertag; //0表示連線 ,1表示線索
typedef struct
bitnodebitnode,*bitree;
bitree pre;
//全域性變數 ,始終指向訪問過的節點
2.二叉樹的建立
//二叉樹的建立
void createbitree(bitree *t)
else
}
3.將二叉樹中的空指標線索化,pre指向最後乙個結點
就只是將二叉樹中空的指標線索化,一開始的pre指向的是頭結點
voidcreatethread(bitree t)
if(!pre->rchild) //
如果上乙個結點沒有右子樹
pre=t;//
向下迴圈
createthread(t->rchild);
}}
4.新增頭結點
步驟如下:
(1).先建立乙個頭結點,
(2).頭結點的左指標指向該二叉樹的根節點,表示為link.
(3)中序遍歷的第乙個結點的左指標表示為thread,指向頭結點
(4)中序遍歷的尾結點的的右指標表示為thrad,指向頭結點
(5).頭結點的右指標指向的是二叉樹中序遍歷的尾結點,表示為thread.
//線索二叉樹增加頭結點
void createheadnode(bitree *thrt,bitree t)
(*thrt)->ltag=link; //
左邊是連線
(*thrt)->rtag=thread; //
右邊是線索
(*thrt)->rchild=*thrt; //
右邊指標指向自己
if(!t) //
如果二叉樹為空
else
//如果二叉樹不為空
}
5.按照中序遍歷的方法非遞迴進行遍歷
中序遍歷:先找到最左節點,再訪問其根節點,再訪問右結點
這裡的方法是:
1.先找到最左節點,然後列印該結點
2.如果該結點存在右子樹,訪問右子樹,則返回迴圈
2.如果不存在右子樹,則訪問線索,列印出該結點,訪問其右子樹,然後迴圈
voidmiddlesort(bitree t)
printf(
"%c
",p->data);
while(p->rtag==thread&&p->rchild!=t)
p=p->rchild; //
若p->rchild不是線索(是右孩子),p指向右孩子,返回迴圈
}}
所有的**如下:
#include#includetypedef
enumpointertag; //
0表示連線 ,1表示線索
typedef struct
bitnodebitnode,*bitree;
bitree pre;
//全域性變數 ,始終指向訪問過的節點
//二叉樹的建立
void createbitree(bitree *t)
else}//
二叉樹的中序遍歷來線索化 ,線索化結束後pre指向最後的乙個結點
void
createthread(bitree t)
if(!pre->rchild) //
如果上乙個結點沒有右子樹
pre=t;//
向下迴圈
createthread(t->rchild);
}}//
線索二叉樹增加頭結點
void createheadnode(bitree *thrt,bitree t)
(*thrt)->ltag=link; //
左邊是連線
(*thrt)->rtag=thread; //
右邊是線索
(*thrt)->rchild=*thrt; //
右邊指標指向自己
if(!t) //
如果二叉樹為空
else
//如果二叉樹不為空
} //
中序遍歷線索二叉樹t的非遞迴演算法
void
middlesort(bitree t)
printf(
"%c
",p->data);
while(p->rtag==thread&&p->rchild!=t)
p=p->rchild; //
若p->rchild不是線索(是右孩子),p指向右孩子,返回迴圈}}
intmain()
這就是完整的線索二叉樹了,可能線索二叉樹也有其它的表示方式,也可以嘗試寫一下。
(C )二叉樹的線索化 線索二叉樹
線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...
C 線索二叉樹
using system namespace bithrtree class bithrtree else 線索化二叉樹 static btnode pre,h static public void threading ref btnode t static public void thread r...
C 線索二叉樹
using system namespace bithrtree class bithrtree else 線索化二叉樹 static btnode pre,h static public void threading ref btnode t static public void thread r...