例1. 括號匹配
例2. 計算簡單表示式
哈夫曼樹的定義
在含有n個帶權葉子結點的二叉樹中,其中帶權路徑長度(wpl)最小的二叉樹稱為哈夫曼樹,也成為最優二叉樹。
構造哈夫曼樹的演算法描述如下:
給定n個權值分別為w1, w2, …, wn的節點。
(1)將這n個結點分別作為n棵樹僅含乙個結點的二叉樹,構成森林f.
(2)構造乙個新節點,並從f中選取兩棵根結點權值最小的樹作為新節點的左、右子樹,並且將新節點的權值置為左、右子樹上根結點的權值之和。
(3)從f中刪除剛才選出的兩棵樹,同時將新得到的樹加入f中。
(4)重複步驟2和3,直至f中只剩下一棵樹為止。
在構造哈夫曼樹的過程中使用小根堆可以在o(logn)的時間內取得n個元素中最小的數。借助stl中的優先佇列,利用如下語句:
// 定義乙個小根堆:
priority_queue<
int, vector<
int>
, greater<
int>> q;
// 元素入隊
q.push
(x;)
// 取堆頂元素
int a = q.
top();
// 元素出堆
q.pop(
);
例3:
題目描述:哈夫曼樹,第一行輸入乙個數n,表示葉節點的個數。需要用這些葉節點生成哈夫曼樹,根據哈夫曼樹的概念,這些節點有權值,即 weight,題目需要計算出所有節點與權值的乘積之和。
輸入有多組資料:
第一行資料n;
第二行有n個資料
樣例輸入:
51 2 2 5 9
樣例輸出:
37
c++實現:
#include
#include
#include
using
namespace std;
priority_queue<
int, vector<
int>
, greater<
int>
> q;
intmain()
int ans =0;
while
(q.size()
>1)
printf
("%d"
, ans);}
return0;
}
二叉樹節點的資料結構:
struct tnode tnode,
*bitree;
**題目:**已知二叉樹的前序遍歷和中序遍歷, 求二叉樹的後序遍歷結果,根據前序和中序建立二叉樹再輸出結果。
cpp程式設計結果:
#include
using
namespace std;
typedef
struct tnode tnode,
*bitree;
bitree creattree
(char pre,
char in,
int pl,
int pr,
int il,
int ir)
else
if(lenr )
else
return root;
}void
postorder
(bitree t)
}void
postdelettree
(bitree root)
}int
main()
return0;
}
#include
using
namespace std;
typedef
struct bnode bnode,
*bitree;
void
preorder
(bitree t)
}void
inorder
(bitree t)
}void
postorder
(bitree t)
}bitree bisorttree
(bitree &root,
int a)
else
return root;
}void
postdelettree
(bitree root)
}int
main()
printf
("前序遍歷結果:");
preorder
(t);
printf
("\n中序遍歷結果: ");
inorder
(t);
printf
("\n後序遍歷結果:");
postorder
(t);
printf
("\n");
postdelettree
(t);
}return0;
}
題目:開始是乙個數n(0思路:比較二叉排序樹的遍歷結果來判斷兩棵樹是否一樣
#include
#include
using
namespace std;
typedef
struct bnode bnode,
*bitree;
void
preorder
(bitree t,
char po,
int&index)
}void
inorder
(bitree t,
char po,
int&index)
}bitree bisorttree
(bitree &root,
int a)
else
return root;
}void
postdelettree
(bitree root)
}int
main()
;char pold[10]
=;char iold[10]
=;char str[10]
=;char pstr[10]
=;char istr[10]
=;int index =0;
scanf
("%s"
, old)
;int i =0;
for(i =
0; old[i]
!='\0'
; i++
) t =
bisorttree
(t, old[i]);
index =0;
preorder
(t, pold, index)
; index =0;
inorder
(t, iold, index)
;postdelettree
(t);
for(
int j =
0; j < n; j++
)scanf
("%s"
, str)
;for
(int k =
0; str[k]
!='\0'
; k++
) nt =
bisorttree
(nt, str[k]);
index =0;
preorder
(nt, pstr, index)
; index =0;
inorder
(nt, istr, index);if
(strcmp
(pold, pstr)==0
&&strcmp
(iold, istr)==0
)printf
("yes\n");
else
printf
("no\n");
postdelettree
(nt);}
printf
("please input the number n: ");
}return0;
}
王道機考系列 日期類問題
有兩個日期,計算兩個日期之間的天數,如果兩個日期是連續的,我們規定他們之間的天數為兩天。輸入 有多組輸入,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd 輸出 每組資料輸出一行,即日期差值。樣例輸入 20110412 20110422 樣例輸出 11解析 將原問題統一到乙個確定的起點區間上...
王道資料結構複習(一)
本次資料結構複習重點複習了第一章緒論中關於時間複雜度的計算。一下簡要介紹一下複習結果 乙個語句的頻度是指該語句在演算法中被重複執行的次數。演算法中所有語句的頻度之和記為t n 它是該演算法問題規模n的函式,時間複雜度主要分析t n 的數量級。演算法中的基本運算 最深層迴圈內的語句 的頻度與t n 同...
王道考研 資料結構 筆記
上面這張圖來自課件,發現這張圖將計算機四大基礎學科之間的關係很好的體現出來了,故貼在這。資料元素 資料項 資料元素是資料的基本單位。資料元素由資料項組成。如,在飯館排隊的顧客,可用以下資料元素和資料項表示 資料結構 資料物件 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。資料物件是具有相...