3 樹和二叉樹

2021-10-22 20:32:24 字數 4296 閱讀 8376

二叉鍊錶

typedef

struct btnodebtnode,

*bitree;

三叉鍊錶
typedef

struct btnodebtnode,

*bitree;

1. 層序遍歷

鍊錶形式

void

levelorder

(bitree t)

}}

陣列形式(陣列q+頭尾front,rear)
void

levelorder

(bitree t)

}}

2.先序遍歷

遞迴

void

preorder

(bitree t)

}

非遞迴(借助棧實現)
同中序遍歷的順序,將訪問節點位置改為第一次指向該結點時

void

preorder

(bitree t,visitfunc visit)

else

}}

3.中序遍歷

遞迴

void

inorder

(bitree t)

}

非遞迴
指標p從根開始,沿左子樹向下移動併入棧儲存

void

inorder

(bitree t,visitfunc vist)

else

}}

4.後序遍歷

遞迴

void

postorder

(bitree t)

}

非遞迴
只有從右子樹返回時才訪問根節點,需增加乙個棧標記到達結點的次序

void

postorder

(bitree t,visitfunc visit)

else

else

}//-----------------------------

}}

儲存結構
typedef

struct threadnodethreadnode,

*threadthree;

tag=0表示孩子結點,tag=1表示前驅後繼

中序遍歷對二叉樹線索化(遞迴)
void

inthread

(threadtree &p,threadtree &pre)

if(pre!=

null

&& pre-

>rchild==

null

) pre=p;

//標記當前結點為剛訪問的結點

inthread

(p->rchild,pre)

;//遞迴,線索化右子樹

}}

主程式:
void

creatinthread

(threadtree t)

}

中序線索二叉樹遍歷

1求中序線索樹中中序列的第乙個結點

threadnode *

firstnode

(threadnode *p)

2求結點p在中序序列的後繼
threadnode *

nextnode

(threadnode *p)

3不含頭結點的中序線索二叉樹的中序遍歷演算法
void inorder (threadnode *t)

雙親表示法結構
#define max_tree_size 100

typedef

struct

ptnode;

typedef

struct

ptree;

孩子兄弟表示法結構
typedef

struct csnodecsnode,

*cstree;

二叉排序樹

查詢

遞迴:(思路:1.若為空,則找不到2.先於根比較,若小於根找左子樹,反之右子樹)

bsttree bstsearch

(bitree t,elemtype x)

非遞迴

bstnode *

bstsearch

(bitree t,elemtype x)

return t;

}

插入
int

bst_insert

(bitree &t,keytype k)

else

if(k==t-key)

return0;

else

if(k==t-

>key)

//存在相同結點,插入失敗

return0;

else

if(k < t-

>key)

//比當前小,插入左邊

return

bst_insert

(t->lchild,k)

;else

//比當前大,插入右邊

return

bst_insert

(t->rchild,k)

;}

構造
void

creat_bst

(bitree &t,keytype str,

int n)

}

(哈弗曼樹)

儲存結構

typedef

struct

htnode,

*huffmantree;

//動態分配陣列儲存哈弗曼樹

typedef

char

**huffmancode;

//動態分配陣列儲存哈弗曼編碼表

求哈夫曼編碼
從葉子結點開始到根逆向處理

//w存放n個字元的權值(均》0),構造哈弗曼樹ht,並求出n個字元的哈夫曼編碼hc

void huffmancoding (huffmantree &ht,huffmancode &hc,

int*w,

int n)

;for

(;i<=m;

++i,

++p)

*p=;

for(i=n+

1;i<=m;i++

)//----從葉子到根逆向求每個字元的哈夫曼編碼----

hc=(huffmancode)

malloc

((n+1)

*sizeof

(char*)

);//分配n個字元編碼的頭指標向量

cd=(char

*)malloc

(n*sizeof

(char))

;分配求編碼的空間

cd[n-1]

="\0"

;//編碼結束符

for(i=

1;i<=n;

++i)

free

(cd)

;//釋放工作空間

}

從根出發求各個葉子結點的(p148)

hc =

(huffmancode)

malloc

((n+1)

*sizeof

(char*)

);p = m; cdlen =0;

for(i=

1;i<=m++i) ht[i]

.weight =0;

//遍歷哈弗曼樹時作用結點狀態標誌

while

(p)else

if(ht[p]

.rchild==0)

}else

if(ht[p]

.weight==1)

}else

//else

}//while

二叉樹3(恢復二叉樹)

給一顆帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷序列,找乙個葉子使得它到根的路徑上的權值盡可能小,如果有多解,取葉子權值小的。輸入中第一行為中序遍歷,第二行為後序遍歷。例如輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 輸出輸入 7 8 11 3 5 16...

二叉樹 滿二叉樹和完全二叉樹

二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...