理論基礎 二叉樹 線索鍊錶

2021-09-24 06:49:55 字數 1439 閱讀 6464

對於乙個有 n 個結點的二叉鍊錶,每個結點指向左右孩子的兩個指標域,故共有 2n 個指標域,而 n 個結點的二叉樹共有 n-1 條分支,即存在 2n-(n-1)=n+1 個空指標域,白白浪費了資源。

另一方面,在二叉鍊錶上,只能知道每個結點的左右孩子結點的位址,而不知道某個結點的前驅和後繼,要想知道,必須對二叉樹進行遍歷,以後每次想要知道時,都要遍歷一次,這無疑浪費了時間。

綜合以上兩個方面,可以考慮利用空位址,存放指向結點在某種遍歷次序下的前驅與後繼,將指向前驅與後繼的指標稱為線索,加上線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹就稱為線索二叉樹

線索化的實質就是將二叉鍊錶中的空指標改為指向前驅或後繼的線索,因此其儲存結構相較於二叉鍊錶有了更改

typedef enum tag;//link=0表示指向左右孩子指標,thead=1表示指向前驅或後繼的線索

templatestruct node;

對二叉樹以某種次序遍歷使其變為線索二叉樹的過程稱為線索化,由於二叉樹的遍歷分為前序、中序、後序、層序四種,那麼相應的,在建立線索二叉樹時,依據遍歷次序的不同,也同樣分為四種:

templateclass threadtree;
建構函式的功能是建立乙個中序線索鍊錶,實質上就是將二叉樹中的空指標改為指向前驅或後繼的線索,而前驅或後繼資訊只有在遍歷該二叉樹時才能得到,因此建立線索鍊錶應先建立乙個二叉鍊錶,然後在遍歷的過程中修改空指標建立線索鍊錶。

templatethreadtree::threadtree()

templatenode* threadtree::creat(node*bt)

}templatevoid threadtree::inthread(node*bt,node*pre)

if(pre->rchild!=null)

pre=bt;//保持pre指向bt的前驅

inthread(bt->rchild,pre);//遞迴右子樹線索化}}

首先判斷當前結點是否已有線索,若已有,則可直接得到後繼,若沒有,則要尋找當前結點的右孩子的最左下結點

templatenode* threadtree::findnext(node*bt)

return q;

}

對線索鍊錶進行中序遍歷操作時,只要尋找到中序序列的第乙個結點,然後依次訪問其後繼即可

templatevoid threadtree::inorder()}}

理論基礎 二叉樹 二叉鍊錶

二叉樹一般採用二叉鍊錶儲存,其基本思想是 令二叉樹的每個結點對應乙個鍊錶結點,鍊錶結點除了存放與二叉樹結點有關的資料資訊外,還要設定指示左右孩子的指標。templatestruct node 如圖,乙個二叉鍊錶的儲存結構如下 templateclass bitree 前序遍歷 void inorde...

二叉樹線索化

二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...

二叉樹線索化

名稱 二叉樹線索化 說明 這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。這裡要注意的是 對於中序來說,其能線索化後訪問到其前驅和後繼 可以理解為不通過棧訪問到 而對於後序來說,其只能不通過...