資料結構之二叉樹的線索化

2021-07-06 03:23:59 字數 1439 閱讀 5571

線索二叉樹

指向前驅和後繼的指標稱為線索,加上線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹

lchild

ltag

data

rtag

rchild

當ltag 為0 時指向該結點的做孩子,為1 時指向該結點的前驅

當rtag為0 時指向該結點的右孩子,為1時指向該結點的後繼

線索化:二叉樹以某種次序遍歷使其變為線索二叉樹的過程稱為線索化,實質:是將二叉鍊錶中的空指標改為指向前驅或後繼的線索,由於前驅和後繼的資訊只有在遍歷該二叉樹時才能得到,所以線索化的過程就是在遍歷的過程中修改空指標的過程

#include#include#define true 1

#define false 0

#define ok 1

#define eeror

typedef int status ;

typedef enumtag;//記錄是指向前驅後繼還是指向其子樹,link代表指向其子樹,thread代表指向其前驅或者後繼

typedef struct treenodetreenode,*tree;

tree pre;//全域性變數,代表指向剛剛訪問過的結點

void create(tree *tree)

else

create(&(*tree)->rchild);//建立右子樹

if((*tree) -> rchild) }}

/* 中序遍歷線索化

當此結點沒有左孩子(或者沒有右孩子)時,修改其指標,lchild指向上一結點,也就是前驅(修改rchild,使其指向後繼)

*/void threadtree(tree tree)

if(!pre->rchild)

pre = tree;//更換pre

threadtree(tree->rchild); }}

/*給線索化後的二叉樹新增上頭結點,並使頭結點的lchild指向二叉樹的根,讓二叉樹遍歷的第乙個結點lchild指向頭結點,最後乙個結點的rchild指向頭結點,頭結點的rchild指向二叉樹遍歷的最後乙個

結點。這樣既可以從第乙個結點起順後繼進行遍歷,也可以從最後乙個結點起順前驅進行遍歷

*/status addheadnode(tree tree,tree *th)

else

return ok;

}void inorder(tree tree)

printf("%c",p->data);

while(p->rtag == thread && p->rchild != tree)

p = p ->rchild; }}

void main()

資料結構 二叉樹的線索化

線索二叉樹它解決了無法直接找到該結點在某種遍歷序列中的前趨和後繼結點的問題,出現了二叉鍊錶找左 右孩子困難的問題,線索二叉樹又分為前序線索化,中序線索化和後序線索化,分別用不同的邏輯去實現。線索二叉樹的實現思想 借用乙個列舉型別tag其中包含兩個狀態link 代表有資料 thread 代表下乙個節點...

資料結構 14 線索化二叉樹

建立 binarytree 二叉樹 class threadedbinarytree public void threadernodes 編寫對二叉樹 中序線索化方法 public void threadernodes heronode node 向左 threadernodes node.getl...

線索二叉樹 資料結構

按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...