樹
樹是資料結構內很重要的一種結構。不過我們此處不深究,僅討論二叉樹,線索二叉樹,哈夫曼樹(最優樹)。
1.二叉樹
定義:
(1)空樹;(2)只有乙個根節點;(3)有左右兩個子樹,並且子樹也是一顆二叉樹(如圖)。
性質:
第 i 層上最多有
個節點.
2.深度為k的樹最多有
個節點,我們稱之為滿二叉樹,滿二叉樹在底層從右向左減少n個節點,此時稱為完全二叉樹。
3.度為0的結點的個數為度為2的節點個數加一,
n個節點的完全二叉樹的深度為
。注釋:[x]表示不超過x的最大整數,也就是向下取整。
節點序號為 i ,在子節點存在的情況下,節點的序號為2i和2i+1
遍歷方式
先序遍歷:先訪問根節點,再訪問左子樹然後是右子樹。
中序遍歷:先訪問左子樹,再訪問根節點然後再右子樹。
後序遍歷:先訪問左子樹,再訪問右子樹然後是根節點。
先序中序,後序中序能唯一的確定唯一乙個二叉樹
還有其他三種遍歷方式 : 只需將以上三種方式的左和右換位置即可
儲存結構
順序儲存結構(由於太浪費記憶體,所以說一般不用)
鏈式儲存結構:利用二叉鍊錶來組成的二叉樹(有n個節點的二叉樹,含有n+1個空鏈域)。
樹
#include
typedef struct lnodelnode,*linklnode;
//建立樹
void setleaf(linklnode &l)
lnode *w=new lnode;
l=w;
l->data=data;
setleaf(l->left);
setleaf(l->right);}
//先序遍歷
void xian(linklnode l)
//中序遍歷
void zhong(linklnode l)
//後序遍歷
void hou(linklnode l)
//度為0的節點個數
int ling(linklnode l)
//度為1的節點個數
int yi(linklnode l)
//從數的最左邊,最底層,開始往高處,往右側檢測
//度為2的節點個數
int er(linklnode l)
//計算樹的深度
int deep(linklnode l)
void main()
2 .線索二叉樹線索二叉樹與二叉樹大致一樣,只不過是將空鏈域充分利用起來,便於查詢每個節點的前驅和後繼。
**僅是中序線索二叉樹
#include
typedef struct lnodelnode,*linklnode;
//建立樹
void setleaf(linklnode &l)
lnode *w=new lnode;
l=w;
l->data=data;
setleaf(l->left);
setleaf(l->right);}
//中序遍歷
void zhong(linklnode &l)
//設定線索
void guo(linklnode &l)
printf("此時返回到了%cn",l->data);
if(l->you!=0)
printf("準備返回上一層n");
return;}
lnode *m;
m=l;
while(1)
else
m=m->right;
if(m==null)
}}
void main()
3 .哈夫曼樹
又名最優樹,就是指帶權路徑最小的數,也是二叉樹的一種,僅包含度為0或者2的節點。
構造方法
取權值最小的兩個節點,作為額外乙個空節點的左右兩個孩子,然後取第三小的權值節點,與這顆樹組成新樹,以此類推,構成一顆哈夫曼樹。權值越大的節點離根節點越近。
一棵樹為樹,兩棵樹及以上則稱為森林
1——樹
前面介紹的僅是二叉樹,乙個節點只能有兩個孩子,對於樹的話則是乙個節點可以有無數個孩子
儲存結構
孩子兄弟表示法:此方法等於說是將樹化為一顆二叉樹,孩子在左,兄弟在右,處理方法將於二叉樹類似了,頗為常用(根節點的右孩子必為空)。
遍歷
2——森林
兩顆及以上的樹構成森林,森林也可以轉化為一棵樹,規則也是孩子在左,兄弟在右
遍歷
資料結構 中序線索二叉樹
所謂線索二叉樹無非是為了讓原本指向null的節點指向乙個詳細的 已經存在的節點,邏輯上實現指標的無空指向的實現。以下是我中 序線索二叉樹的實現。還是把先序線索二叉樹與後序線索分開來寫吧。include using namespace std template struct node template...
資料結構 線索二叉樹的線索化(中序 先序 後序)
線索二叉樹 include include typedef struct threadnodethreadnode,threadtree threadnode pre null 定義全域性變數pre,指向當前訪問結點的前驅 threadtree createthreadtree threadtree...
二叉樹的中序線索樹 資料結構 線索二叉樹
1.引入線索二叉樹 二叉樹的遍歷實質上是對乙個非線性結構實現線性化的過程,使每乙個節點 除第乙個和最後乙個外 在這些線性序列中有且僅有乙個直接前驅和直接後繼。但在二叉鍊錶儲存結構中,只能找到乙個節點的左 右孩子資訊,而不能直接得到節點在任一遍歷序列中的前驅和後繼資訊。這些資訊只有在遍歷的動態過程中才...