DS 二叉樹操作

2021-10-01 05:10:27 字數 3838 閱讀 6989

終於…在下課前寫完了上機作業!!!??

(也有可能是不難吧hh)

趁熱打鐵總結一下

高頻子樹和

在一棵二叉樹中,給定乙個結點,以該結點為根的子樹中所有結點的和,為該子樹的和。有一棵二叉樹,找出其**現次數最多的子樹和。如果有多個結果,輸出所有結果

輸入

二叉樹的節點個數n和二叉樹的層次遍歷序列

3 6 2 -4

輸出

4 2 -4

#include

#include

using namespace std;

int n,a[

100]

,res[

100]

,c[1000]=

,i=0

;template

class bintreenode

t data;

bintreenode *lchild,

*rchild;

bintreenode

(const t&t)

:data

(t),

lchild

(null),

rchild

(null)}

;template

class bintree

bintreenode

*root;

void

create

(bintreenode

*root,

int i)

;void

show

(bintreenode

*root)

;int

subsum

(bintreenode

*root,bintree tree);}

;template

void bintree::

create

(bintreenode

*root,

int i)if(

2*i+

2}template

void bintree::

show

(bintreenode

*root)

template

int bintree::

subsum

(bintreenode

*root,bintree tree)

intmain()

//count

for(

int j=

0;j<

1000

;j++

) cout<<

"result:"

int j=

0;j<

1000

;j++)if

(c[j]

==c[max]

) cout<" ";

cout<}

思路:清晰明了,先根據層次遍歷建樹

然後遞迴求子樹和,並把結果儲存在res陣列裡

最後處理結果,用c陣列記錄res陣列裡數字的出現次數,然後求出最大次數,再輸出所有res陣列裡==最大次數的結果即可

現在看來空間複雜度和時間複雜度都很糟糕,如果不是限時的話會選擇用結構陣列來處理結果,結構中乙個是出現次數,另乙個是儲存res中下標的陣列

哈夫曼樹

第一行輸入n,表示葉結點的個數,第二行輸入葉節點的權值

首先構建哈夫曼樹,然後輸出所有節點到根節點的路徑長度與葉節點權值的乘積之和(帶權路徑長度和)

輸入:n,n個葉節點的權值

510 5 20 10 18

輸出

141

#include

using namespace std;

#define maxn 100

typedef

struct node node;

int w[

2*maxn-1]

;int h[

2*maxn-1]

;node addr[

2*maxn-1]

;template

class huffmantree

node *root;

void

show

(node *root)

;int

wpl(node *root,

int level);}

;template

void huffmantree::

show

(node *root)

template

int huffmantree::

wpl(node*root,

int level)

wpln+

=wpl

(root->lchild,level+1)

; wpln+

=wpl

(root->rchild,level+1)

;return wpln;

}node *

create_huffman_tree

(int w,

int n)

for(i=n;i<

2*n-

1;i++

)else

if(u < min2)}}

node *p=new node()

; addr[i]

=*p;

addr[i]

.lchild=

&addr[n1]

; addr[i]

.rchild=

&addr[n2]

; w[i]

=w[n1]

+w[n2]

; w[n1]

=-w[n1]

; w[n2]

=-w[n2]

;addr[i]

.data=

-w[i];}

w[2*n-2]

=-w[

2*n-2]

;return

&addr[

2*n-2]

;}intmain()

huffmantree<

int> tree;

tree.root=

create_huffman_tree

(w, n)

; cout<<

"huffmantree:"

show

(tree.root)

;cout

"result:"

<}

建哈夫曼樹老師給了**,是自己改的

建哈夫曼樹的思路很重要!!

求路徑長度與求深度不同,這裡的**參考了網路,覺得好棒!!

依舊是遞迴思路,第一層長度為0,之後每向下遞迴一層+1

(哦天吶我現在才明白是要求帶權外部路徑長度…)

因為是外部路徑,所以只需要葉子結點的權重即可,才會有那句if(root->rchild== null&&root->lchild==null)

ok果然這次不難……?

突然會發現,學期都快結束了

這個學期過得真快啊,感覺始終是忙碌,但是忙碌中又有很多欣喜,這就足夠了

希望未來幾周繼續努力不要洩氣,希望最後的結果讓自己滿意

加油!!

DS樹 二叉樹高度

給出一棵二叉樹,求它的高度。二叉樹的建立採用前面實驗的方法。注意,二叉樹的層數是從1開始 第一行輸入乙個整數t,表示有t個二叉樹 第二行起輸入每個二叉樹的先序遍歷結果,空樹用字元 0 表示,連續輸入t行 每行輸出乙個二叉樹的高度 include using namespace std class t...

DS二叉樹 二叉樹之父子結點

題目描述 給定一顆二叉樹的邏輯結構如下圖,先序遍歷的結果,空樹用字元 0 表示,例如ab0c00d00 建立該二叉樹的二叉鏈式儲存結構。編寫程式輸出該樹的所有葉子結點和它們的父親結點 輸入 第一行輸入乙個整數t,表示有t個二叉樹 第二行起,按照題目表示的輸入方法,輸入每個二叉樹的先序遍歷,連續輸入t...

二叉樹操作

最近在溫習資料結構,把書中的 寫了一遍,下面是二叉樹的基本操作,包括 1 四種遍歷二叉樹的方法 前序遍歷 中序遍歷 後序遍歷和層序遍歷,其中又包括了遞迴的和非遞迴 2 兩種建立二叉樹的方法 根據二叉樹的前序和中序序列建立二叉樹和根據二叉樹的中序後序序列建立二叉樹。1.二叉樹的儲存結構 headfil...