欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言解析二叉樹,go 二叉樹

二叉樹刪除葉結(jié)點(diǎn)的問(wèn)題

刪除節(jié)點(diǎn)后,取其左子樹的最大元素填充該節(jié)點(diǎn),留下的空缺由它的下層元素填充。

成都創(chuàng)新互聯(lián)公司從2013年成立,先為新河等服務(wù)建站,新河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為新河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

如果無(wú)左子樹,則直接用右孩子填充。

刪30:

60

/

\

20

80

\

\

40

90

/

/

35

85

/

\

32

88

刪80:

60

/

\

30

90

/

\

/

20

40

85

/

\

35

88

/

32

刪60:

40

/

\

30

80

/

\

\

20

35

90

/

/

32

85

\

88

實(shí)現(xiàn)上述二叉搜索樹刪除操作的函數(shù)為:

bstree

delete(

elementtype

x,bstree

t)

{

position

tmpcell;

if(t==null)

error("要?jiǎng)h除的元素x未找到");

else

if(xt-element)

/*go

left

*/

t-left=delete(x,t-left);/*

在左子樹遞歸刪除*/

else

if(xt-element)

/*go

right

*/

t-right=delete(x,t-right);/*

在右子樹遞歸刪除*/

else

/*找到要?jiǎng)h除的節(jié)點(diǎn)*/

if(t-left!=null)

/*刪除節(jié)點(diǎn)有左子樹*/

{

/*在左子樹中找最小的元素填充刪除節(jié)點(diǎn)*/

tmpcell=findmax(t-left);

t-element=tmpcell-element;

t-left=delete(t-element,t-left);/*在刪除節(jié)點(diǎn)的左子樹中刪除最大元素*/

}

else

/*刪除節(jié)點(diǎn)無(wú)左子樹*/

{

t=t-left;

free(tmpcell);

}

return

t;

}

二叉樹什么意思

如果文字表達(dá)的話就是下面的,若看不懂,可以在百度的圖片搜索里輸入二叉樹找張圖對(duì)照著比劃下,應(yīng)該能看懂。概念并不是很難。

說(shuō)簡(jiǎn)單點(diǎn)就是一個(gè)點(diǎn)分兩個(gè)叉,這兩個(gè)叉又分別分兩個(gè)叉(搜張圖就明白這句了)。~~~~~

樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹形象表示。樹在計(jì)算機(jī)領(lǐng)域中也得到廣泛應(yīng)用,如在編譯源程序如下時(shí),可用樹表示源源程序如下的語(yǔ)法結(jié)構(gòu)。又如在數(shù)據(jù)庫(kù)系統(tǒng)中,樹型結(jié)構(gòu)也是信息的重要組織形式之一。一切具有層次關(guān)系的問(wèn)題都可用樹來(lái)描述。

一、樹的概述

樹結(jié)構(gòu)的特點(diǎn)是:它的每一個(gè)結(jié)點(diǎn)都可以有不止一個(gè)直接后繼,除根結(jié)點(diǎn)外的所有結(jié)點(diǎn)都有且只有一個(gè)直接前趨。以下具體地給出樹的定義及樹的數(shù)據(jù)結(jié)構(gòu)表示。

(一)樹的定義

樹是由一個(gè)或多個(gè)結(jié)點(diǎn)組成的有限集合,其中:

⒈必有一個(gè)特定的稱為根(ROOT)的結(jié)點(diǎn);

⒉剩下的結(jié)點(diǎn)被分成n=0個(gè)互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個(gè)又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。

樹的遞歸定義如下:(1)至少有一個(gè)結(jié)點(diǎn)(稱為根)(2)其它是互不相交的子樹

5. 2 二叉樹

1.二叉樹的基本形態(tài):

二叉樹也是遞歸定義的,其結(jié)點(diǎn)有左右子樹之分,邏輯上二叉樹有五種基本形態(tài):

(1)空二叉樹——(a);

(2)只有一個(gè)根結(jié)點(diǎn)的二叉樹——(b);

(3)右子樹為空的二叉樹——(c);

(4)左子樹為空的二叉樹——(d);

(5)完全二叉樹——(e)

注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。

2.兩個(gè)重要的概念:

(1)完全二叉樹——只有最下面的兩層結(jié)點(diǎn)度小于2,并且最下面一層的結(jié)點(diǎn)都集中在該層最左邊的若干位置的二叉樹;

(2)滿二叉樹——除了葉結(jié)點(diǎn)外每一個(gè)結(jié)點(diǎn)都有左右子女且葉結(jié)點(diǎn)都處在最底層的二叉樹,。

5.普通樹轉(zhuǎn)換成二叉樹:凡是兄弟就用線連起來(lái),然后去掉父親到兒子的連線,只留下父母到其第一個(gè)子女的連線。

二叉樹很象一株倒懸著的樹,從樹根到大分枝、小分枝、直到葉子把數(shù)據(jù)聯(lián)系起來(lái),這種數(shù)據(jù)結(jié)構(gòu)就叫做樹結(jié)構(gòu),簡(jiǎn)稱樹。樹中每個(gè)分叉點(diǎn)稱為結(jié)點(diǎn),起始結(jié)點(diǎn)稱為樹根,任意兩個(gè)結(jié)點(diǎn)間的連接關(guān)系稱為樹枝,結(jié)點(diǎn)下面不再有分枝稱為樹葉。結(jié)點(diǎn)的前趨結(jié)點(diǎn)稱為該結(jié)點(diǎn)的"雙親",結(jié)點(diǎn)的后趨結(jié)點(diǎn)稱為該結(jié)點(diǎn)的"子女"或"孩子",同一結(jié)點(diǎn)的"子女"之間互稱"兄弟"。

二叉樹:二叉樹是一種十分重要的樹型結(jié)構(gòu)。它的特點(diǎn)是,樹中的每個(gè)結(jié)點(diǎn)最多只有兩棵子樹,即樹中任何結(jié)點(diǎn)的度數(shù)不得大于2。二叉樹的子樹有左右之分,而且,子樹的左右次序是重要的,即使在只有一棵子樹的情況下,也應(yīng)分清是左子樹還是右子樹。定義:二叉樹是結(jié)點(diǎn)的有限集合,這個(gè)集合或是空的,或是由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的稱之為左子樹和右子樹的二叉樹組成。

(三)完全二叉樹

對(duì)滿二叉樹,從第一層的結(jié)點(diǎn)(即根)開始,由下而上,由左及右,按順序結(jié)點(diǎn)編號(hào),便得到滿二叉樹的一個(gè)順序表示。據(jù)此編號(hào),完全二叉樹定義如下:一棵具有n個(gè)結(jié)點(diǎn),深度為K的二叉樹,當(dāng)且僅當(dāng)所有結(jié)點(diǎn)對(duì)應(yīng)于深度為K的滿二叉樹中編號(hào)由1至n的那些結(jié)點(diǎn)時(shí),該二叉樹便是完全二叉樹。圖4是一棵完全二叉樹。

二叉樹的遍歷

5.1樹的概念

樹的遞歸定義如下:(1)至少有一個(gè)結(jié)點(diǎn)(稱為根)(2)其它是互不相交的子樹

1.樹的度——也即是寬度,簡(jiǎn)單地說(shuō),就是結(jié)點(diǎn)的分支數(shù)。以組成該樹各結(jié)點(diǎn)中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)或終端結(jié)點(diǎn)。樹中度不為零的結(jié)點(diǎn)稱為分枝結(jié)點(diǎn)或非終端結(jié)點(diǎn)。除根結(jié)點(diǎn)外的分枝結(jié)點(diǎn)統(tǒng)稱為內(nèi)部結(jié)點(diǎn)。

2.樹的深度——組成該樹各結(jié)點(diǎn)的最大層次,如上圖,其深度為4;

3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結(jié)點(diǎn)A,其原來(lái)的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;

4.有序樹——指樹中同層結(jié)點(diǎn)從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無(wú)序樹。

5.樹的表示

樹的表示方法有許多,常用的方法是用括號(hào):先將根結(jié)點(diǎn)放入一對(duì)圓括號(hào)中,然后把它的子樹由左至右的順序放入括號(hào)中,而對(duì)子樹也采用同樣的方法處理;同層子樹與它的根結(jié)點(diǎn)用圓括號(hào)括起來(lái),同層子樹之間用逗號(hào)隔開,最后用閉括號(hào)括起來(lái)。如上圖可寫成如下形式:

(A(B(E(K,L),F),C(G),D(H(M),I,J)))

5. 2 二叉樹

1.二叉樹的基本形態(tài):

二叉樹也是遞歸定義的,其結(jié)點(diǎn)有左右子樹之分,邏輯上二叉樹有五種基本形態(tài):

(1)空二叉樹——(a);

(2)只有一個(gè)根結(jié)點(diǎn)的二叉樹——(b);

(3)右子樹為空的二叉樹——(c);

(4)左子樹為空的二叉樹——(d);

(5)完全二叉樹——(e)

注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。

2.兩個(gè)重要的概念:

(1)完全二叉樹——只有最下面的兩層結(jié)點(diǎn)度小于2,并且最下面一層的結(jié)點(diǎn)都集中在該層最左邊的若干位置的二叉樹;

(2)滿二叉樹——除了葉結(jié)點(diǎn)外每一個(gè)結(jié)點(diǎn)都有左右子女且葉結(jié)點(diǎn)都處在最底層的二叉樹,。

如下圖:

完全二叉樹

滿二叉樹

3.二叉樹的性質(zhì)

(1) 在二叉樹中,第i層的結(jié)點(diǎn)總數(shù)不超過(guò)2^(i-1);

(2) 深度為h的二叉樹最多有2h-1個(gè)結(jié)點(diǎn)(h=1),最少有h個(gè)結(jié)點(diǎn);

(3) 對(duì)于任意一棵二叉樹,如果其葉結(jié)點(diǎn)數(shù)為N0,而度數(shù)為2的結(jié)點(diǎn)總數(shù)為N2,

則N0=N2+1;

(4) 具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為int(log2n)+1

(5)有N個(gè)結(jié)點(diǎn)的完全二叉樹各結(jié)點(diǎn)如果用順序方式存儲(chǔ),則結(jié)點(diǎn)之間有如下關(guān)系:

若I為結(jié)點(diǎn)編號(hào)則 如果I1,則其父結(jié)點(diǎn)的編號(hào)為I/2;

如果2*I=N,則其左兒子(即左子樹的根結(jié)點(diǎn))的編號(hào)為2*I;若2*IN,則無(wú)左兒子;

如果2*I+1=N,則其右兒子的結(jié)點(diǎn)編號(hào)為2*I+1;若2*I+1N,則無(wú)右兒子。

4.二叉樹的存儲(chǔ)結(jié)構(gòu):

(1)順序存儲(chǔ)方式

type node=record

data:datatype

l,r:integer;

end;

var tr:array[1..n] of node;

(2)鏈表存儲(chǔ)方式,如:

type btree=^node;

node=record

data:datatye;

lchild,rchild:btree;

end;

5.普通樹轉(zhuǎn)換成二叉樹:凡是兄弟就用線連起來(lái),然后去掉父親到兒子的連線,只留下父母到其第一個(gè)子女的連線。

6.二叉樹的遍歷運(yùn)算(遞歸定義)

(1)先序遍歷

訪問(wèn)根;按先序遍歷左子樹;按先序遍歷右子樹

(2)中序遍歷

按中序遍歷左子樹;訪問(wèn)根;按中序遍歷右子樹

(3)后序遍歷

按后序遍歷左子樹;按后序遍歷右子樹;訪問(wèn)根

例1.用順序存儲(chǔ)方式建立一棵有31個(gè)結(jié)點(diǎn)的滿二叉樹,并對(duì)其進(jìn)行先序遍歷。

program erchashu1;

var b:array[1..31] of char;

e:array[1..63] of byte;

n,h,i,k:integer;

procedure tree(t:integer);

begin

if e[t]=0 then exit

else

begin

write(b[t]);e[t]:=0;

t:=2*t;tree(t);

t:=t+1;tree(t);

end;

end;

begin

repeat

write('n=');readln(n);

until (n0) and (n6);

fillchar(e,sizeof(e),0);

k:=trunc(exp(n*ln(2)))-1;

for i:=1 to k do e[i]:=1;

for i:=1 to 26 do b[i]:=chr(64+i);

for i:=1 to 5 do b[26+i]:=chr(48+i);

h:=1 ;tree(h);

writeln;

end.

例2.用順序存儲(chǔ)方式建立一棵如圖所示的二叉樹,并對(duì)其進(jìn)行先序遍歷。

program tree1;

const n=15;

type node=record

data:char;

l,r:0..n;

end;

var tr:array[1..n] of node;

e:array[1..n] of 0..1;

i,j:integer;

procedure jtr;

var i:integer;

begin

for i:=1 to n do

with tr[i] do

readln(data,l,r);

end;

procedure search(m:integer);

begin

with tr[m] do

begin

write(data);

if l0 then search(l);

if r0 then search(r);

end;

end;

begin

jtr;search(1);writeln;

end.

例3 用鏈表存儲(chǔ)方式生成上述二叉樹,中序遍歷之。

1.將上述二叉樹用廣義表表示為A(B(D,E(G)),C(F(,H)))

2.根據(jù)廣義表串(以#結(jié)束)生成二叉樹。

program ltree;

const n=8;

type trlist=^node;

node=record

da:char;

l,r:trlist;

end;

var s:array[1..n] of trlist;

p,root:trlist;

ch:char;

top,k:integer;

procedure creat(var head:trlist);

begin

read(ch);

top:=0;

while ch'#' do

begin

case ch of

'A'..'Z':begin new(p);p^.da:=ch;p^.l:=nil;p^.r:=nil;

if top0 then

case k of

1:s[top]^.l:=p;

2:s[top]^.r:=p;

end

end;

'(':begin top:=top+1;s[top]:=p;k:=1;end;

')': top:=top-1;

',': k:=2;

end;

read(ch);

end;

head:=s[1];

end;

procedure inorder(head:trlist);

begin

if head^.lnil then inorder(head^.l);

write(head^.da);

if head^.rnil then inorder(head^.r);

end;

begin

write('Input tree string:');

creat(root);

inorder(root);

end.

5.3 二叉樹的應(yīng)用

1. 哈夫曼樹與哈夫曼碼

樹的路徑長(zhǎng)度:一棵樹的每一個(gè)葉結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長(zhǎng)度的和。

帶權(quán)二叉樹:給樹的葉結(jié)點(diǎn)賦上某個(gè)實(shí)數(shù)值(稱葉結(jié)點(diǎn)的權(quán))。

帶權(quán)路徑長(zhǎng)度:各葉結(jié)點(diǎn)的路徑長(zhǎng)度與其權(quán)值的積的總和。

哈夫曼樹(最優(yōu)二叉樹):帶權(quán)路徑長(zhǎng)度最小的二叉樹。

如何構(gòu)建哈夫樹:(思想是:權(quán)越大離跟越近)

program gojiantree;

const n=4;m=7;

type node=record

w:real;

parent,lchild,rchild:0..m

end;

htree=array[1..m] of node;

var htree1:htree;

procedure gjtree(var ht:htree);

var i,j:integer;

small1,small2:real;

p1,p2:0..m;

begin

for i:=1 to m do

with ht[i] do

begin

w:=0;lchild:=0;rchild:=0;parent:=0;

end;

for i:=1 to n do read(ht[i].w);

for i:=n+1 to m do

begin

p1:=0;p2:=0;

small1:=1000;small2:=1000;

for j:=1 to i-1 do

if ht[j].parent=0 then

if ht[j].wsmall1 then

begin small2:=small1;small1:=ht[j].w;p2:=p1;p1:=j end

else if ht[j].wsmall2 then begin small2:=ht[j].w;p2:=j end;

ht[p1].parent:=i;

ht[p2].parent:=i;

ht[i].lchild:=p1;

ht[i].rchild:=p2;

ht[i].w:=ht[p1].w+ht[p2].w;

end;

end;

begin

gjtree(htree1);

end.

哈夫曼碼:哈夫曼樹的非葉結(jié)點(diǎn)到左右孩子的路徑分別用0,1 表示,從根到葉的路徑序列即為哈夫曼碼。

哈夫曼碼是不會(huì)發(fā)生譯碼多義性的不等長(zhǎng)編碼,廣泛應(yīng)用實(shí)際中。

(原因是任何一字符的編碼不是更長(zhǎng)編碼的前綴部分,為什么?)

2.排序二叉樹

排序二叉樹:每一個(gè)參加排列的數(shù)據(jù)對(duì)應(yīng)二叉樹的一個(gè)結(jié)點(diǎn),且任一結(jié)點(diǎn)如果有左(右)子樹,則左(右)子樹各結(jié)點(diǎn)的數(shù)據(jù)必須小(大)于該結(jié)點(diǎn)的數(shù)據(jù)。中序遍歷排序二叉樹即得排序結(jié)果。程序如下:

program pxtree;

const

a:array[1..8] of integer=(10,18,3,8,12,2,7,3);

type point=^nod;

nod=record

w:integer;

right,left:point ;

end;

var root,first:point;k:boolean;i:integer;

procedure hyt(d:integer;var p:point);

begin

if p=nil then

begin

new(p);

with p^ do begin w:=d;right:=nil;left:=nil end;

if k then begin root:=p; k:=false end;

end

else with p^ do if d=w then hyt(d,right) else hyt(d,left);

end;

procedure hyt1(p:point);

begin

with p^ do

begin

if leftnil then hyt1(left);

write(w:4);

if rightnil then hyt1(right);

end

end;

begin

first:=nil;k:=true;

for i:=1 to 8 do hyt(a[i],first);

hyt1(root);writeln;

end.

3.堆排序

堆:設(shè)有數(shù)據(jù)元素的集合(R1,R2,R3,...Rn)它們是一棵順序二叉樹的結(jié)點(diǎn)且有

Ri=R2i 和Ri=R2i+1(或=)

堆的性質(zhì):堆的根結(jié)點(diǎn)上的元素是堆中的最小元素,且堆的每一條路徑上的元素都是有序的。

堆排序的思想是:

1)建初始堆(將結(jié)點(diǎn)[n/2],[ n/2]-1,...3,2,1分別調(diào)成堆)

2)當(dāng)未排序完時(shí)

輸出堆頂元素,刪除堆頂元素,將剩余的元素重新建堆。

程序如下:

program duipx;

const n=8;

type arr=array[1..n] of integer;

var a:arr;i:integer;

procedure sift(var a:arr;l,m:integer);

var i,j, t:integer;

begin

i:=l;j:=2*i;t:=a[i];

while j=m do

begin

if (jm) and (a[j]a[j+1]) then j:=j+1;

if ta[j] then

begin a[i]:=a[j];i:=j;j:=2*i; end

else exit;

end;

a[i]:=t;

end;

begin

for i:=1 to n do read(a[i]);

for i:=(n div 2) downto 1 do

sift(a,i,n);

for i:=n downto 2 do

begin

write(a[1]:4);

a[1]:=a[i];

sift(a,1,i-1);

end;

writeln(a[1]:4);

end

go語(yǔ)言中像這樣的map如何解析成struct?

可以先轉(zhuǎn)成json,再反序列化成定義好的結(jié)構(gòu)體

也可以for循環(huán)自己處理

已知一棵二叉樹是以二叉鏈表的形式存儲(chǔ)的求出以T為根的子樹的結(jié)點(diǎn)個(gè)數(shù)和高度

5.1樹的概念

樹的遞歸定義如下:(1)至少有一個(gè)結(jié)點(diǎn)(稱為根)(2)其它是互不相交的子樹

1.樹的度——也即是寬度,簡(jiǎn)單地說(shuō),就是結(jié)點(diǎn)的分支數(shù)。以組成該樹各結(jié)點(diǎn)中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)或終端結(jié)點(diǎn)。樹中度不為零的結(jié)點(diǎn)稱為分枝結(jié)點(diǎn)或非終端結(jié)點(diǎn)。除根結(jié)點(diǎn)外的分枝結(jié)點(diǎn)統(tǒng)稱為內(nèi)部結(jié)點(diǎn)。

2.樹的深度——組成該樹各結(jié)點(diǎn)的最大層次,如上圖,其深度為4;

3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結(jié)點(diǎn)A,其原來(lái)的二棵子樹T1、T2、T3的集合就為森林;

4.有序樹——指樹中同層結(jié)點(diǎn)從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無(wú)序樹。

5.樹的表示

樹的表示方法有許多,常用的方法是用括號(hào):先將根結(jié)點(diǎn)放入一對(duì)圓括號(hào)中,然后把它的子樹由左至右的順序放入括號(hào)中,而對(duì)子樹也采用同樣的方法處理;同層子樹與它的根結(jié)點(diǎn)用圓括號(hào)括起來(lái),同層子樹之間用逗號(hào)隔開,最后用閉括號(hào)括起來(lái)。如上圖可寫成如下形式:

(A(B(E(K,L),F),C(G),D(H(M),I,J)))

5. 2 二叉樹

1.二叉樹的基本形態(tài):

二叉樹也是遞歸定義的,其結(jié)點(diǎn)有左右子樹之分,邏輯上二叉樹有五種基本形態(tài):

(1)空二叉樹——(a);

(2)只有一個(gè)根結(jié)點(diǎn)的二叉樹——(b);

(3)右子樹為空的二叉樹——(c);

(4)左子樹為空的二叉樹——(d);

(5)完全二叉樹——(e)

注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。

2.兩個(gè)重要的概念:

(1)完全二叉樹——只有最下面的兩層結(jié)點(diǎn)度小于2,并且最下面一層的結(jié)點(diǎn)都集中在該層最左邊的若干位置的二叉樹;

(2)滿二叉樹——除了葉結(jié)點(diǎn)外每一個(gè)結(jié)點(diǎn)都有左右子女且葉結(jié)點(diǎn)都處在最底層的二叉樹,。

如下圖:

完全二叉樹

滿二叉樹

3.二叉樹的性質(zhì)

(1) 在二叉樹中,第i層的結(jié)點(diǎn)總數(shù)不超過(guò)2^(i-1);

(2) 深度為h的二叉樹最多有2h-1個(gè)結(jié)點(diǎn)(h=1),最少有h個(gè)結(jié)點(diǎn);

(3) 對(duì)于任意一棵二叉樹,如果其葉結(jié)點(diǎn)數(shù)為N0,而度數(shù)為2的結(jié)點(diǎn)總數(shù)為N2,

則N0=N2+1;

(4) 具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為int(log2n)+1

(5)有N個(gè)結(jié)點(diǎn)的完全二叉樹各結(jié)點(diǎn)如果用順序方式存儲(chǔ),則結(jié)點(diǎn)之間有如下關(guān)系:

若I為結(jié)點(diǎn)編號(hào)則 如果I1,則其父結(jié)點(diǎn)的編號(hào)為I/2;

如果2*I=N,則其左兒子(即左子樹的根結(jié)點(diǎn))的編號(hào)為2*I;若2*IN,則無(wú)左兒子;

如果2*I+1=N,則其右兒子的結(jié)點(diǎn)編號(hào)為2*I+1;若2*I+1N,則無(wú)右兒子。

4.二叉樹的存儲(chǔ)結(jié)構(gòu):

(1)順序存儲(chǔ)方式

type node=record

data:datatype

l,r:integer;

end;

var tr:array[1..n] of node;

(2)鏈表存儲(chǔ)方式,如:

type btree=^node;

node=record

data:datatye;

lchild,rchild:btree;

end;

5.普通樹轉(zhuǎn)換成二叉樹:凡是兄弟就用線連起來(lái),然后去掉父親到兒子的連線,只留下父母到其第一個(gè)子女的連線。

6.二叉樹的遍歷運(yùn)算(遞歸定義)

(1)先序遍歷

訪問(wèn)根;按先序遍歷左子樹;按先序遍歷右子樹

(2)中序遍歷

按中序遍歷左子樹;訪問(wèn)根;按中序遍歷右子樹

(3)后序遍歷

按后序遍歷左子樹;按后序遍歷右子樹;訪問(wèn)根

例1.用順序存儲(chǔ)方式建立一棵有31個(gè)結(jié)點(diǎn)的滿二叉樹,并對(duì)其進(jìn)行先序遍歷。

program erchashu1;

var b:array[1..31] of char;

e:array[1..63] of byte;

n,h,i,k:integer;

procedure tree(t:integer);

begin

if e[t]=0 then exit

else

begin

write(b[t]);e[t]:=0;

t:=2*t;tree(t);

t:=t+1;tree(t);

end;

end;

begin

repeat

write('n=');readln(n);

until (n0) and (n6);

fillchar(e,sizeof(e),0);

k:=trunc(exp(n*ln(2)))-1;

for i:=1 to k do e[i]:=1;

for i:=1 to 26 do b[i]:=chr(64+i);

for i:=1 to 5 do b[26+i]:=chr(48+i);

h:=1 ;tree(h);

writeln;

end.

例2.用順序存儲(chǔ)方式建立一棵如圖所示的二叉樹,并對(duì)其進(jìn)行先序遍歷。

program tree1;

const n=15;

type node=record

data:char;

l,r:0..n;

end;

var tr:array[1..n] of node;

e:array[1..n] of 0..1;

i,j:integer;

procedure jtr;

var i:integer;

begin

for i:=1 to n do

with tr[i] do

readln(data,l,r);

end;

procedure search(m:integer);

begin

with tr[m] do

begin

write(data);

if l0 then search(l);

if r0 then search(r);

end;

end;

begin

jtr;search(1);writeln;

end.

例3 用鏈表存儲(chǔ)方式生成上述二叉樹,中序遍歷之。

1.將上述二叉樹用廣義表表示為A(B(D,E(G)),C(F(,H)))

2.根據(jù)廣義表串(以#結(jié)束)生成二叉樹。

program ltree;

const n=8;

type trlist=^node;

node=record

da:char;

l,r:trlist;

end;

var s:array[1..n] of trlist;

p,root:trlist;

ch:char;

top,k:integer;

procedure creat(var head:trlist);

begin

read(ch);

top:=0;

while ch'#' do

begin

case ch of

'A'..'Z':begin new(p);p^.da:=ch;p^.l:=nil;p^.r:=nil;

if top0 then

case k of

1:s[top]^.l:=p;

2:s[top]^.r:=p;

end

end;

'(':begin top:=top+1;s[top]:=p;k:=1;end;

')': top:=top-1;

',': k:=2;

end;

read(ch);

end;

head:=s[1];

end;

procedure inorder(head:trlist);

begin

if head^.lnil then inorder(head^.l);

write(head^.da);

if head^.rnil then inorder(head^.r);

end;

begin

write('Input tree string:');

creat(root);

inorder(root);

end.

5.3 二叉樹的應(yīng)用

1. 哈夫曼樹與哈夫曼碼

樹的路徑長(zhǎng)度:一棵樹的每一個(gè)葉結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長(zhǎng)度的和。

帶權(quán)二叉樹:給樹的葉結(jié)點(diǎn)賦上某個(gè)實(shí)數(shù)值(稱葉結(jié)點(diǎn)的權(quán))。

帶權(quán)路徑長(zhǎng)度:各葉結(jié)點(diǎn)的路徑長(zhǎng)度與其權(quán)值的積的總和。

哈夫曼樹(最優(yōu)二叉樹):帶權(quán)路徑長(zhǎng)度最小的二叉樹。

如何構(gòu)建哈夫樹:(思想是:權(quán)越大離跟越近)

program gojiantree;

const n=4;m=7;

type node=record

w:real;

parent,lchild,rchild:0..m

end;

htree=array[1..m] of node;

var htree1:htree;

procedure gjtree(var ht:htree);

var i,j:integer;

small1,small2:real;

p1,p2:0..m;

begin

for i:=1 to m do

with ht[i] do

begin

w:=0;lchild:=0;rchild:=0;parent:=0;

end;

for i:=1 to n do read(ht[i].w);

for i:=n+1 to m do

begin

p1:=0;p2:=0;

small1:=1000;small2:=1000;

for j:=1 to i-1 do

if ht[j].parent=0 then

if ht[j].wsmall1 then

begin small2:=small1;small1:=ht[j].w;p2:=p1;p1:=j end

else if ht[j].wsmall2 then begin small2:=ht[j].w;p2:=j end;

ht[p1].parent:=i;

ht[p2].parent:=i;

ht[i].lchild:=p1;

ht[i].rchild:=p2;

ht[i].w:=ht[p1].w+ht[p2].w;

end;

end;

begin

gjtree(htree1);

end.

哈夫曼碼:哈夫曼樹的非葉結(jié)點(diǎn)到左右孩子的路徑分別用0,1 表示,從根到葉的路徑序列即為哈夫曼碼。

哈夫曼碼是不會(huì)發(fā)生譯碼多義性的不等長(zhǎng)編碼,廣泛應(yīng)用實(shí)際中。

(原因是任何一字符的編碼不是更長(zhǎng)編碼的前綴部分,為什么?)

2.排序二叉樹

排序二叉樹:每一個(gè)參加排列的數(shù)據(jù)對(duì)應(yīng)二叉樹的一個(gè)結(jié)點(diǎn),且任一結(jié)點(diǎn)如果有左(右)子樹,則左(右)子樹各結(jié)點(diǎn)的數(shù)據(jù)必須小(大)于該結(jié)點(diǎn)的數(shù)據(jù)。中序遍歷排序二叉樹即得排序結(jié)果。程序如下:

program pxtree;

const

a:array[1..8] of integer=(10,18,3,8,12,2,7,3);

type point=^nod;

nod=record

w:integer;

right,left:point ;

end;

var root,first:point;k:boolean;i:integer;

procedure hyt(d:integer;var p:point);

begin

if p=nil then

begin

new(p);

with p^ do begin w:=d;right:=nil;left:=nil end;

if k then begin root:=p; k:=false end;

end

else with p^ do if d=w then hyt(d,right) else hyt(d,left);

end;

procedure hyt1(p:point);

begin

with p^ do

begin

if leftnil then hyt1(left);

write(w:4);

if rightnil then hyt1(right);

end

end;

begin

first:=nil;k:=true;

for i:=1 to 8 do hyt(a[i],first);

hyt1(root);writeln;

end.

3.堆排序

堆:設(shè)有數(shù)據(jù)元素的集合(R1,R2,R3,...Rn)它們是一棵順序二叉樹的結(jié)點(diǎn)且有

Ri=R2i 和Ri=R2i+1(或=)

堆的性質(zhì):堆的根結(jié)點(diǎn)上的元素是堆中的最小元素,且堆的每一條路徑上的元素都是有序的。

堆排序的思想是:

1)建初始堆(將結(jié)點(diǎn)[n/2],[ n/2]-1,...3,2,1分別調(diào)成堆)

2)當(dāng)未排序完時(shí)

輸出堆頂元素,刪除堆頂元素,將剩余的元素重新建堆。

程序如下:

program duipx;

const n=8;

type arr=array[1..n] of integer;

var a:arr;i:integer;

procedure sift(var a:arr;l,m:integer);

var i,j, t:integer;

begin

i:=l;j:=2*i;t:=a[i];

while j=m do

begin

if (jm) and (a[j]a[j+1]) then j:=j+1;

if ta[j] then

begin a[i]:=a[j];i:=j;j:=2*i; end

else exit;

end;

a[i]:=t;

end;

begin

for i:=1 to n do read(a[i]);

for i:=(n div 2) downto 1 do

sift(a,i,n);

for i:=n downto 2 do

begin

write(a[1]:4);

a[1]:=a[i];

sift(a,1,i-1);

end;

writeln(a[1]:4);

end

網(wǎng)頁(yè)名稱:go語(yǔ)言解析二叉樹,go 二叉樹
鏈接分享:http://chinadenli.net/article41/dssphhd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)企業(yè)網(wǎng)站制作網(wǎng)站收錄網(wǎng)站建設(shè)品牌網(wǎng)站制作小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)