一:內容補充
(一)森林轉化
森林轉換為二叉樹
⑴ 將森林中的每棵樹轉換成二叉樹;
⑵ 從第二棵二叉樹開始,
依次把後一棵二叉樹的根結點作為前一棵二叉樹根結點的右孩子,
當所有二叉樹連起來後,此時所得到的二叉樹就是由森林轉換得到的二叉樹。
二叉樹轉換為樹或森林
⑴ 加線——若某結點x是其雙親y的左孩子,則把結點x的右孩子、右孩子的右孩子、……,都與結點y用線連起來;
⑵ 去線——刪去原二叉樹中所有的雙親結點與右孩子結點的連線;
⑶ 層次調整——整理由⑴、⑵兩步所得到的樹或森林,使之層次分明。
森林有兩種遍歷方法:
⑴前序(根)遍歷:前序遍歷森林即為前序遍歷森林中的每一棵樹。
⑵後序(根)遍歷:後序遍歷森林即為後序遍歷森林中的每一棵樹。
葉子結點的權值:對葉子結點賦予的乙個有意義的數值量。
二叉樹的帶權路徑長度:設二叉樹具有n個帶權值的葉子結點,從根結點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和。
(二)哈夫曼樹
1)哈夫曼樹:給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。
2)哈夫曼樹的特點:
權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。
只有度為0(葉子結點)和度為2(分支結點)的結點,不存在度為1的結點.
3)哈夫曼演算法基本思想:
⑴ 初始化:由給定的n個權值構造n棵只有乙個根結點的二叉樹,從而得到乙個二叉樹集合f=;
⑵ 選取與合併:在f中選取根結點的權值最小的兩棵二叉樹分別作為左、右子樹構造一棵新的二叉樹,這棵新二叉樹的根結點的權值為其左、右子樹根結點的權值之和;
⑶ 刪除與加入:在f中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到f中;
⑷ 重複⑵、⑶兩步,當集合f中只剩下一棵二叉樹時,這棵二叉樹便是哈夫曼樹。
哈夫曼編碼:
編碼:給每乙個物件標記乙個二進位制位串來表示一組物件。
例:ascii,指令系統
等長編碼:表示一組物件的二進位制位串的長度相等。
不等長編碼:表示一組物件的二進位制位串的長度不相等。
字首編碼:一組編碼中任一編碼都不是其它任何乙個編碼的字首 。
字首編碼保證了在解碼時不會有多種可能。
(三)線索鍊錶
線索:將二叉鍊錶中的空指標域指向前驅結點和後繼結點的指標被稱為線索;
線索化:使二叉鍊錶中結點的空鏈域存放其前驅或後繼資訊的過程稱為線索化;
線索二叉樹:加上線索的二叉樹稱為線索二叉樹。
二叉樹的遍歷方式有4種,故有4種意義下的前驅和後繼,相應的有4種線索二叉樹:
⑴ 前序線索二叉樹
⑵ 中序線索二叉樹
⑶ 後序線索二叉樹
⑷ 層序線索二叉樹
二:例題
1.採用二叉鍊錶的方式進行儲存
2.構造乙個二叉樹類
實現以下演算法:
1.建立二叉樹
2.對二叉樹進行前序、中序、後序遍歷
#include
using namespace std;
struct node
;class tree
~tree()
void firstly()
void midly()
void last()
//void level();
private:
node *creat();
void release(node *bt);
void firstly(node *bt);
void midly(node *bt);
void last(node *bt);
node root;
};nodetree::creat()//建構函式
return bt;
}void tree::firstly(node *bt)//前序遍歷
}void tree::midly(node *bt)//中序遍歷
}void tree::last(node *bt)//後序遍歷
}int tree::count(node *bt)//節點數
int tree::leaf(node *bt)//葉子節點數
int tree::height(node *bt)//樹的高度
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...