1. 程式人生 > 其它 >非線性表-BiTree(特殊二叉樹-需記憶!!!!難啊難)

非線性表-BiTree(特殊二叉樹-需記憶!!!!難啊難)

1:哈夫曼樹-wpl最小-最優二叉樹

1.沒有度為1的結點

2.n個葉子節點的哈夫曼樹共有2n-1個結點

樹的特點:度為2結點和葉結點的關係n2=n0-1
所以:當葉結點為n時,度為二的結點數為n-1
因為哈夫曼沒有度為一的結點,所以一共在樹中有2n-1個結點
3.哈夫曼樹任意非葉結點的左右子樹交換後還是哈夫曼樹

4.對同一組權值{w1,w2,...,wn},是會存在不同結構的哈夫曼樹
BADCADFEED
法一:直接傳遞字元的ASCII碼,每個字元佔八位,一共傳遞80位
法二:我們發現數據只是從A-F,一共6個字元,我們完全可以使用3位二進位制來表示這些資料(網路對方需要知道我們的編碼才能解碼)
A    B   C   D   E   F
000 001 010 011 100 101 001000011010000011101100100011(30) 法三:我們發現一段文字中各個數字出現的頻率是不一樣的,各個字母頻率相加100%,可以使用哈夫曼編碼,對資料再次進行壓縮 假設各個字母頻率為 A 27,B 8,C 15,D 15,E 30,F 5 1.先構造哈夫曼樹 2.獲取字首碼 (1)左右分支分別用0,1表示(避免了二義性) (2)字元只在葉子節點 1001010010101001000111100(25)

2:平衡二叉樹

看這個(重點看構造平衡二叉樹時左右子樹旋轉方法)https://www.cnblogs.com/ssyfj/p/9504996.html

//返回二叉樹的深度,前提T存在
int depth(bitTree T)
{
    
if(!T) return 0; else return max(depth(T->lchild),depth(T->rchild))+1; //這有個缺點,空樹會返回深度1 } //判斷平衡二叉樹 int balance(bitTree t) { int left,right; int cha; if(t!=NULL) { left=depth(t.lchild); right=depth(t.rchild); cha=left-right;
if(cha>1||cha<-1) { return false; } return balance(t.lchild)&&balance((t.rchild)); } }

3:二叉搜尋樹

看這個(重點看插入刪除時樹的變化)https://www.cnblogs.com/ssyfj/p/9503740.html

4:線索二叉樹

暫定