大二汪的期末複習 演算法與資料結構(樹和二叉樹)

2021-10-11 22:50:36 字數 4055 閱讀 5470

5.1.6二叉樹的鏈式儲存結構

5.2 樹和森林

5.3 哈夫曼樹

※易錯點

樹是n(n≥0)個結點的有限值,當n=0時稱為空樹。

非空樹:

(1)有且僅有乙個稱之為根的結點

(2)除根結點以外的其餘結點可分為m個互不相交的有限集,其中每個集合本身又是一棵樹,稱為根的子樹。

樹的結構定義是乙個遞迴的定義。

二叉樹是n(n≥0)個結點所構成的合集。

非空二叉樹t:

(1)有且僅有乙個稱之為根的結點

(2)除根結點以外的其餘結點分為兩個互不相交的子集t1和t2,分別稱為t的左子樹和右子樹,且t1和t2本身都是二叉樹。

二叉樹與樹的主要區別:

(1)二叉樹的每個結點至多只有兩棵子樹,即不存在度大於2的結點。

(2)二叉樹的子樹有左右之分,次序不能任意顛倒。

其中,二叉樹有五種基本形態。

在第一次遍歷時將結點的前驅、後繼資訊儲存下來,便於再次遍歷二叉樹。

線索化:若無左子樹,則其左指標指向其前驅結點。若無右子樹,則其左指標指向其後繼結點。

在二叉樹的第i層上至多有2(i-1)個結點。(i≥1)

深度為k的二叉樹至多有2k-1個結點。(k≥1)

對任何一顆二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。

具有n個結點的完全二叉樹的深度為|log2

n|+1。

如果對一顆有n個結點的完全二叉樹(其深度為|log2

n|+1)的結點按層序編號(從第1層到第|log2

n|+1層,每層從左到右),則對任一結點i(1≤i≤n),有

(1)如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則雙親parent(i)是結點i/2。

(2)如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子lchild(i)是結點2i。

(3)如果2i+1>n,則結點i無右孩子;否則其右孩子rchild(i)是結點2i+1。

順序儲存結構使用一組位址連續的儲存單元來儲存資料元素。結點按照一定的規律安排在這組單元中。

對於完全二叉樹,從根起按層序儲存,依次自上而下、自左至右儲存結點元素。(適用)

對於一般二叉樹,則應將其每個結點與完全二叉樹上的結點相對照,可以「0」表示不存在此結點。

#include

#include

using

namespace std;

char str[

1000];

void

bianli

(int i,

int n)

intmain()

return0;

}

#include

#include

using

namespace std;

char s[55]

;typedef

struct bilnodebilnode,

*bitree;

bitree create

(int i,

int l)

void

print

(bitree t)

}int

main()

return0;

}

設計不同的結點結構可構成不同形式的鏈式儲存結構。如二叉鍊錶三叉鍊錶

在含有n個結點的二叉鍊錶中有n+1個空鏈域。

利用空鏈域儲存其他有用資訊,可得到另一種鏈式儲存結構——線索鍊錶。

typedef

struct bitlnodebitlnode,

*bitree;

先序遍歷:根—左—右

中序遍歷:左—根—右

後序遍歷:左—右—根

層序遍歷:從上到下,從左至右

無論是哪種遍歷方式,其時間複雜度均為o(n),空間複雜度也為o(n)。

確定二叉樹:前+中、後+中

中序遍歷

遞迴演算法:

void

inorder

(bitree t)

}

非遞迴演算法:

void

inorder

(bitree t)

else

}}

層序遍歷
void

cengxubianli

(bitree t)

}

先序遍歷建立二叉鍊錶
void

create

(bitree t)

}

複製二叉樹
void

copy

(bitree t,bitree &newt)

else

}

計算二叉樹的深度
int

depth

(bitree t)

}

統計二叉樹中結點的個數
int

nodecount

(bitree t)

}

統計二叉樹中葉結點的個數
int

findye

(bitree t)

else

return

(num1+num2)

;}

統計二叉樹中度為1的結點個數

統計二叉樹中度為2的結點個數

int

finddu2

(bitree t)

else

return0;

}

求中序遍歷序列的第乙個結點值
bilnode*

zhong

(bitree t)

輸出二叉樹
void

print

(linklist l)

cout<}

用括號法輸出二叉樹
void

print

(bitree t)

print

(t->rchild)

; cout<<

")";}}

}

二叉樹的按值查詢
bilnode *

findnode

(bitree t,

char x)

if(t-

>rchild!=

null)}

return

null

;}

二叉鍊錶查詢其雙親及左右孩子值
void

find

(bitree &t,

char k)

find

(t->lchild,t-

>data)

;find

(t->rchild,t-

>data);}

}

二叉樹的刪除以值x為根結點的子樹
void

find

(bitree &t,

char x)

}}

任何一顆和樹對應的二叉樹,其根結點的右子樹必空。

見書p135。

森林轉換成二叉樹

二叉樹轉換成森林

哈夫曼樹又稱最優樹

在哈夫曼樹中,任何乙個結點它的度都是02

哈夫曼樹的結點個數不能是偶數

哈夫曼編碼是最優字首編碼。

哈夫曼樹的根結點的權值等於各個葉子結點的權值之和。

當一棵具有n個葉子結點的二叉樹的wpl值為最小時,稱其樹為哈夫曼樹,其二叉樹的形狀是唯一的。

哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近。

資料結構與演算法期末複習題

在帶有頭結點的單鏈表hl中,要向表頭插入乙個由指標p指向的結點,則執行 a a.p next hl next hl next p b.p next hl hl p c.p next hl p hl d.hl p p next hl 乙個棧的輸入序列為1 2 3,則下列序列中不可能是棧的輸出序列的是 ...

資料結構期末複習

1 基於鄰接表 2struct vertexnode3 7struct edgenode8 12struct vertexnode adjlist 100 13 int visited 100 14 void gs int a,int n,int e 15 22for k 0 k e k 2330 ...

資料結構期末複習(一)

一.判斷題 字串是資料物件特定的線性表 t 乙個無向圖的連通分量是其極大的連通子圖 t 解析位址 假設b是一棵樹,b 是對應的二叉樹。則b的後根遍歷相當於b 的中序遍歷 t 通常,二叉樹的第i層上有2i 1個結點 f 對於一棵m階的b 樹,樹中每個結點至多有m 個關鍵字。除根之外的所有非終端結點至少...