二叉樹的遍歷本質上是將乙個複雜的非線性結構轉換為線性結構,使每個結點都有了唯一前驅和後繼(第乙個結點無前驅,最後乙個結點無後繼)。對於二叉樹的乙個結點,查詢其左右子女是方便的,其前驅後繼只有在遍歷中得到。為了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指標,這種方法增加了儲存開銷,不可取;二是利用二叉樹的空鏈指標。
1.具體做法
圖示:
**:
typedef char elemtype;
#define end '#'
typedef enum pointertag;
typedef struct bithrnode
bithrnode,*binarythreadtree;
void makethread(bithrnode *p,bithrnode *&ptr) //線索化
if(ptr != null && ptr->rightchild == null)
ptr = p;
makethread(p->rightchild,ptr); }}
void makethreadtree(bithrnode *p) //線索化二叉樹
**解釋;
2.優勢
(1)利用線索二叉樹進行中序遍歷時,不必採用堆疊處理,速度較一般二叉樹的遍歷速度快,且節約儲存空間。
(2)任意乙個結點都能直接找到它的前驅和後繼結點
不足(1)結點的插入和刪除麻煩,且速度也較慢。
(2)線索子樹不能共用。
3.注意事項
注意makethread函式的第二個引數,他是乙個指標的引用。這樣做的目的是為了讓指標ptr在遞迴的過程中所發生的改變,能夠影響到每一層棧幀。
要深刻理解遞迴呼叫**執行軌跡,只有這樣才能為用好遞迴提供先決條件
線索化的過程是對空指標的利用,千萬不要改變原來指標的指向
看**要深刻理解**的思路,把我**的執行軌跡,不要只看效果,那樣只會增加莫名的感覺,沒實際效果
看不懂,想不通,畫圖、畫圖、畫圖,重要的事情說三遍。
線索化二叉樹以及遍歷線索化二叉樹
1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...
線索化二叉樹
define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...
線索化二叉樹
二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...