十七 二叉樹的建立與基本操作

2021-10-10 04:04:14 字數 3193 閱讀 2356

編寫程式實現二叉樹的如下操作:

建立二叉鍊錶

二叉樹的先序、中序、後序遍歷

求二叉樹的葉子結點個數

將二叉樹中所有結點的左、右子樹相互交換

輸入:

按完全二叉樹的層次關係給出二叉樹的遍歷序列(#表示虛結點,資料結點為單一字元)。

輸出:

二叉樹的凹入表示

二叉樹的先序序列、中序序列、後序序列

二叉樹葉子結點個數

左、右子樹相互交換後的二叉樹的凹入表示

左、右子樹相互交換後的二叉樹的先序序列、中序序列、後序序列。

說明:

在輸出凹入表示的二叉樹時,先輸出根結點,然後依次輸出左右子樹,上下層結點之間相隔 3 個空格。

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

abc#de

1秒64m

0測試用例 2

abcdefg

1秒64m

0二叉鍊錶的儲存表示在教材的 127 頁進行了介紹

typedef

struct bitnode

bitnode,

*bitree;

建立一顆二叉樹

進行二叉樹的凹入表示

找到二叉樹的前、中、後序遍歷的結果

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

1、按完全二叉樹的層次關係建立一顆二叉樹。給出二叉樹的層次序列,那麼我們需要借助佇列來建立這顆二叉樹。(層次序列都適合用佇列處理,類似於 bfs 的思想)

2、二叉樹的凹入表示,按照層次關係進行輸出。第一層沒有空格,第二層乙個tab(四個空格),第二層兩個tab······

3、二叉樹的三種遍歷序列很適合用遞迴的方式來遍歷求解

中序遍歷

後序遍歷

4、統計二叉樹中葉子結點個數。葉子結點的左右指標域不指向任何結點,要麼是\0,要麼是#,根據這個條件可以找出葉子結點。然後統計葉子結點又得遍歷一遍二叉樹,所以將葉子結點的統計和二叉樹的其中乙個遍歷結合操作起來更省事。

至於左右子樹交換後的各種表示,對二叉樹表示的順序進行簡單的翻轉就可以實現,**的編寫就是左右次序交換的問題。

例如,對二叉樹的中序遍歷,應該先輸出左子樹,接著輸出該結點的值,最後輸出右子樹。左右子樹交換後的二叉樹的中序遍歷,應該先輸出右子樹,接著輸出該結點的值,最後輸出左子樹。

#include

#include

#include

#include

#include

#include

using namespace std;

//二叉樹的儲存表示

typedef

struct bitnode

bitnode,

*bitree;

queueq;

//輔助佇列

int counts =0;

//統計葉子結點數目

void

createbitree()

;//建立二叉樹

void

visit

(bitree r)

;//訪問結點

void

print

(bitree r,

int n)

;//輸出二叉樹

void

pre_sequence

(bitree r)

;//先序遍歷

void

in_sequence

(bitree r)

;//中序遍歷

void

post_sequence

(bitree r)

;//後序遍歷

/* 左右子樹交換後的各種表示 */

void

swap_print

(bitree r,

int n)

;void

swap_pre_sequence

(bitree r)

;void

swap_in_sequence

(bitree r)

;void

swap_post_sequence

(bitree r)

;int

main()

void

createbitree()

}void

visit

(bitree r)

void

print

(bitree r,

int n)

visit

(r);

cout << endl;

//一層一層往下找

n++;print

(r->lchild, n)

;print

(r->rchild, n);}

}void

pre_sequence

(bitree r)

}void

in_sequence

(bitree r)

}void

post_sequence

(bitree r)

}void

swap_print

(bitree r,

int n)

visit

(r);

cout << endl;

n++;swap_print

(r->rchild, n)

;swap_print

(r->lchild, n);}

}void

swap_pre_sequence

(bitree r)

}void

swap_in_sequence

(bitree r)

}void

swap_post_sequence

(bitree r)

}

二叉樹的建立和遍歷序列,在之後的學習中還會繼續遇到,建議大家一定要自己總結出乙個自己認為好用的模板。

比如編寫乙個利用層次序列建立二叉樹的模板,下次又遇到的時候可以直接使用模板而不是再編寫一遍。同樣地,三種遍歷序列的模板也是很需要的,遞迴方式和非遞迴方式都要掌握。

二叉樹的深度 十七 二叉樹的最小深度

二叉樹的最小深度 從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最短路徑的長度為樹的最小深度。演算法一 description 二叉樹最小深度 param root 二叉樹 function binarytreemindepth root 演算法二 description 二叉樹最...

二叉樹的建立與基本操作

編寫程式實現二叉樹的如下操作 1 建立二叉鍊錶 2 二叉樹的先序 中序 後序遍歷 3 求解二叉樹的葉子結點個 4 將二叉樹中所有結點的左 右子樹相互交換 輸入 擴充套件二叉樹先序序列 ab d ce 其中 代表空指標。輸出 二叉樹的凹入表示 二叉樹的先序序列 中序序列 後序序列 二叉樹葉子結點個數 ...

二叉樹基本操作 二叉樹的建立與遞迴遍歷

建立的二叉樹如下 來構建上圖的二叉樹 詳細 如下 include using namespace std typedef char datatype 二叉樹的左右鏈表示,也叫做二叉鍊錶表示 typedef struct node node typedef node btree btree precr...