樹和二叉樹 哈夫曼樹和線索二叉樹

2021-10-01 04:41:14 字數 2640 閱讀 4357

最優二叉樹:

葉子結點的權值:對葉子結點賦予的乙個有意義的數值量。

二叉樹的帶權路徑長度:設二叉樹具有n個帶權值的葉子結點,從根結點到各個葉子結點的路徑長度與相應葉子結點權值的乘積之和。

哈夫曼樹:給定一組具有確定權值的葉子結點,帶權路徑長度最小的二叉樹。

哈夫曼樹的特點:

1 權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。

2 只有度為0(葉子結點)和度為2(分支結點)的結點,不存在度為1的結點.

哈夫曼演算法基本思想:

⑴ 初始化:由給定的n個權值構造n棵只有乙個根結點的二叉樹,從而得到乙個二叉樹集合f=;

⑵ 選取與合併:在f中選取根結點的權值最小的兩棵二叉樹分別作為左、右子樹構造一棵新的二叉樹,這棵新二叉樹的根結點的權值為其左、右子樹根結點的權值之和;

⑶ 刪除與加入:在f中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到f中;

⑷ 重複⑵、⑶兩步,當集合f中只剩下一棵二叉樹時,這棵二叉樹便是哈夫曼樹。

設定乙個陣列hufftree[2n-1]儲存哈夫曼樹中各點的資訊,陣列元素的結點結構

weight:權值域,儲存該結點的權值;

lchild:指標域,結點的左孩子結點在陣列中的下標;

rchild:指標域,結點的右孩子結點在陣列中的下標;

parent:指標域,該結點的雙親結點在陣列中的下標;

struct element

;1:陣列hufftree初始化,所有元素結點的雙親、左

右孩子都置為-1;

2. 陣列hufftree的前n個元素的權值置給定值w[n];

3. 進行n-1次合併

3.1 在二叉樹集合中選取兩個權值最小的根結點,

其下標分別為i1, i2;

3.2 將二叉樹i1、i2合併為一棵新的二叉樹k(初值為n;依次遞增);

**:

void huffmantree(element hufftree[ ], int w[ ], int n ) 

for (i=0; i哈夫曼編碼:

編碼:給每乙個物件標記乙個二進位制位串來表示一組物件。

例:ascii,指令系統

等長編碼:表示一組物件的二進位制位串的長度相等。

不等長編碼:表示一組物件的二進位制位串的長度不相等。

字首編碼:一組編碼中任一編碼都不是其它任何乙個編碼的字首 。

字首編碼保證了在解碼時不會有多種可能。

線索二叉樹:

在有n個結點的二叉鍊錶中共有2n個鏈域,但只有n-1個有用的非空鏈域,其餘n+1個鏈域是空的。

**我們可以利用剩下的n+1個空鏈域來存放遍歷過程中結點的前驅和後繼資訊。

線索:將二叉鍊錶中的空指標域指向前驅結點和後繼結點的指標被稱為線索;

線索化:使二叉鍊錶中結點的空鏈域存放其前驅或後繼資訊的過程稱為線索化;

線索二叉樹:加上線索的二叉樹稱為線索二叉樹

itag=0: lchild指向該結點的左孩子

itag=1: lchild指向該結點的前驅結點。

rtag=0: rchild指向該結點的右孩子

rtag=1: rchild指向該結點的後繼結點

enum flag ; //列舉型別:列舉常量child=0,thread=1;

template

struct thrnode

;中序線索鍊錶:

建有帶有標誌位的二叉樹:

template thrnode* inthrbitree::creat( )

return root;

}

函式設定形參root和全域性變數pre,分別表示要處理的樹的根結點和其前驅結點

如果root!=null

中序線索化root的左子樹

中序線索化root本身

如果root->lchild= =null

root->left=pre,root->ltag=1;

如果root->rchild==null,root->rtag=1,

如果pre!=null, 並且pre->rtag=1,

pre->rchild=root,;

pre=root

中序線索化root的右子樹

中序線索化二叉樹:遞迴

template void thrbitree::thrbitree (thrnode*root) 

if (!root->rchild) root->rtag = thread;

if(pre != null)

pre = root;

thrbitree(root->rchild);

}template inthrbitree::inthrbitree( )

在中序線索二叉樹中查詢結點的中序遍歷的後繼:

template thrnode* inthrbitree::next(thrnode* p)

}return q;

}

中序遍歷中序線索二叉樹

template void inthrbitree::inorder(thrnode*root)

coutwhile (p->rchild!=null)

cout<}

哈夫曼樹和線索二叉樹

線索二叉樹的思想 於二叉樹的儲存結構中,存在一些空的指標域,因此是否能夠將這些空間利用起來,儲存一些關於節點間先後順序的資訊,由此產生了線索二叉樹。線索二叉樹中,線索反映前驅 後繼的關係,而指標則體現左右子樹。以二叉鍊錶為例,線索二叉樹儲存結構上的特點是新增識別符號,表明左右指標域究竟存的是指向前驅...

樹和二叉樹 森林 線索二叉樹

1 三叉鍊錶 在二叉鍊錶的基礎上增加了乙個指向雙親的指標域。2 三叉鍊錶的結點資料型別宣告 templatestruct node 3 樹 二叉樹 1.兄弟加線。2.保留雙親與第一孩子連線,刪去與其他孩子的連線。3.順時針轉動,使之層次分明。樹的前序遍歷等價於二叉樹的前序遍歷!樹的後序遍歷等價於二叉...

樹與二叉樹 哈夫曼樹

01 路徑和路徑長度 定義 在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l 1。例子 100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。02 結點的權及帶...