二叉樹的線索化

2022-03-20 05:07:59 字數 1976 閱讀 2826

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。二叉樹作為儲存結構時,乙個節點只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅或後繼資訊。

也就是說,線索二叉樹就是充分利用二叉樹節點中的空指標,讓它們分別指向本節點的前驅或者後繼。既充分利用了資源,又方便我們遍歷這顆二叉樹。

1、線索二叉樹的概念

n個節點的二叉樹中含有n+1個空指標域。利用二叉樹中的空指標域 來存放在某種遍歷次序下的前驅和後繼 ,這種指標叫「線索」。這種加上了線索的二叉樹稱為線索二叉樹(threaded binarytree)。根據遍歷次序的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。

2、線索二叉樹結構定義

/*

線索化二叉樹的結構

*/enum

flag

;struct

treenode

;

intvalue;

treenode *left;

treenode *right;

flag left_flag;

flag right_flag;

};

value  

left    

left_flag

right    

right_flag

3、前序線索二叉樹實現

/*

前序遍歷的構建

*/void prevcreate(treenode *root, treenode *&prev) //&prev用引用,相當於全域性變數的作用,在整個遞迴過程傳遞

/*前序線索下的遍歷

4、中序線索二叉樹實現

/*

中序遍歷的構建

*/void increate(treenode *root, treenode *&prev)

if(prev && prev->right ==null)

prev =root;

increate(root->right, prev);}}

/*中序線索下的遍歷

5、線索化思想拓展題目:如何將乙個二叉樹轉化成乙個有序的雙向鍊錶?

在沒有學線索化之前,這道題可能非常麻煩。但現在,利用中序線索化的思想就可以很快將這道題做出來!

/*

利用中序線索化思想將二叉樹轉換成有序的雙向鍊錶

*/void treetolist(treenode *root)

本博文參考

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

線索化二叉樹以及遍歷線索化二叉樹

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...