王道機考系列 資料結構

2021-09-05 12:20:06 字數 4273 閱讀 4532

例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 同...

王道考研 資料結構 筆記

上面這張圖來自課件,發現這張圖將計算機四大基礎學科之間的關係很好的體現出來了,故貼在這。資料元素 資料項 資料元素是資料的基本單位。資料元素由資料項組成。如,在飯館排隊的顧客,可用以下資料元素和資料項表示 資料結構 資料物件 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。資料物件是具有相...