哈夫曼樹及二叉樹

2021-07-13 20:07:32 字數 1697 閱讀 7452

昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了

哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和

#include

priority_queueq 這個是最大堆

最小堆這樣寫:priority_queue, greater> q   另外,用vs2012寫的時候總是不能過,是因為還需要加乙個標頭檔案,#include

二重點說說二叉樹,

可根據包括中序遍歷的兩個遍歷確定一棵樹

寫程式時需注意給節點申請空間什麼的,主要是我對指標什麼的還是理解的不太透徹,所以還是需要注意一下

貼個**:根據前序和中序確定後序

#include#include#include#include#include#includeusing namespace std;

struct nodetree[50];

int cnt;//代表樹的節點個數

node* create()

char str1[30];

char str2[30];

node* build(int s1,int e1,int s2, int e2)

} if(rootidx!=s2)

if(rootidx!=e2)

return res;//返回根節點指標

}void postorder(node* t)

int main()tree[100];

int loc;

node *create()

node* insert(node* t,int x)

else

return t;

}char str1[25];

char str2[25];

int size1,size2;

char* str;//當前正在儲存的字串

int* size;//當前正在儲存的字串的個數

void preorder(node* t)

void inorder(node* t)

int main(){

int n;

char tmp[12];

while(cin>>n&&n!=0){

cin>>tmp;

loc=0;

node* t=null;

for(int i=0;tmp[i]!='\0';i++)

t=insert(t,tmp[i]-'0');

size1=0;//初始化為0

str=str1;//將str的首位址指向str1的首位址所指向的地方

size=&size1;

preorder(t);

inorder(t);

str1[size1]='\0';

// cout<>tmp;

node* t2=null;

for(int i=0;tmp[i]!='\0';i++)

t2=insert(t2,tmp[i]-'0');

size2=0;//初始化為0

str=str2;//將str的首位址指向str2的首位址所指向的地方

size=&size2;

preorder(t2);

inorder(t2);

str2[size2]='\0';

if(strcmp(str1,str2)==0)

cout<<"yes"<

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

二叉樹與哈夫曼樹

1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...

哈夫曼樹(最優二叉樹)

最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...