二叉鍊錶
三叉鍊錶typedef
struct btnodebtnode,
*bitree;
1. 層序遍歷typedef
struct btnodebtnode,
*bitree;
鍊錶形式
陣列形式(陣列q+頭尾front,rear)void
levelorder
(bitree t)
}}
2.先序遍歷void
levelorder
(bitree t)
}}
遞迴
非遞迴(借助棧實現)void
preorder
(bitree t)
}
同中序遍歷的順序,將訪問節點位置改為第一次指向該結點時
3.中序遍歷void
preorder
(bitree t,visitfunc visit)
else
}}
遞迴
非遞迴void
inorder
(bitree t)
}
指標p從根開始,沿左子樹向下移動併入棧儲存
4.後序遍歷void
inorder
(bitree t,visitfunc vist)
else
}}
遞迴
非遞迴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求中序線索樹中中序列的第乙個結點
2求結點p在中序序列的後繼threadnode *
firstnode
(threadnode *p)
3不含頭結點的中序線索二叉樹的中序遍歷演算法threadnode *
nextnode
(threadnode *p)
雙親表示法結構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...