Problem 11098 二叉樹遍歷

2021-04-19 08:39:02 字數 2471 閱讀 8169

二叉樹遍歷

time limit:1000ms,special time limit:2500ms,memory limit:32768kb

total submit users:50,accepted users:46

problem 11098 :no special judgement

problem description

遍歷一棵二叉樹就是按某種次序系統地「訪問」二叉樹上的所有結點,並使每乙個結點恰好被訪問一次。所謂「訪問」乙個結點,是指對該結點的資料域進行某種處理,處理的內容依具體問題而定,通常比較簡單。我們知道,遍歷乙個線性結構很容易,只須從開始結點出發順序掃瞄每個結點即可。但是二叉樹是乙個非線性結構,每個結點可以有兩個後繼結點,因此需要尋找一種規律來系統地訪問樹中各結點。遍歷運算的關鍵在於訪問結點的「次序」,這種次序應保證二叉樹上的每個結點均被訪問一次且僅一次。

由定義可知,一棵二叉樹由三部分組成:根、左子樹和右子樹。因此對於二叉樹的遍歷也可相應地分解成三項「子任務」:

①訪問根結點;

②遍歷左子樹(即依次訪問左子樹上的全部結點);

③遍歷右子樹(即依次訪問右子樹上的全部結點)。

因為左、右子樹都是二叉樹(可以是空二叉樹),對它們的遍歷可以按上述方法繼續分解,直到每棵子樹均為空二叉樹為止。由此可見,上述三項子任務的次序決定了遍歷的次序。若以d、l、r分別表示這三項子任務,則共有6種可能的次序:dlr、ldr、lrd、drl、rdl和rld。通常限定「先左後右」,即子任務②在子任務③之前完成,這樣就只剩下前三種次序,按這三種進行的遍歷分別稱為先根遍歷(或前序遍歷)、中根(或中序)遍歷、後根(或後序)遍歷。三種遍歷方法的定義如下。

先根遍歷 若需遍歷的二叉樹為空,執行空操作;否則,依次執行下列操作:

①訪問根結點;

②先根遍歷左子樹;

③先根遍歷右子樹。

中根遍歷 若需遍歷的二叉樹為空,執行空操作;否則,依次執行下列操作:

①中根遍歷左子樹;

②訪問根結點;

③中根遍歷右子樹。

後根遍歷 若需遍歷的二叉樹為空,執行空操作;否則,依次執行下列操作:

①後根遍歷左子樹;

②後根遍歷右子樹;

③訪問根結點。

顯然,上述三種遍歷方法的區別在於執行子任務「訪問根結點」的「時機」不同;若最先(最後、在中間)執行此子任務,則為先根(後根、中根)遍歷。

按某種遍歷方法遍歷一棵二叉樹,將得到該二叉樹上所有結點的訪問序列。

input

輸入的第一行包含單獨的乙個數字t,表示測試序列的數目;

以下t個部分,每個部分乙個測試序列;

每個測試序列的第一行包含乙個整數n(0 < n ≤ 1000),表示二叉樹的節點數;

接下來n行,每行按照這樣如下的格式依次描述每個節點:

字元資料 左孩子序號 右孩子序號

其中節點的字元資料是乙個單字元,如果左/右孩子不存在,用0表示其序號。

output

對應每個測試序列,輸出以下四行:

case #: '#'是從一開始的測試序列號;

先序遍歷的結果

中序遍歷的結果

後序遍歷的結果

sample input

2

8* 2 3

+ 4 5

- 0 6

x 0 0

y 0 0

/ 7 8

a 0 0

2 0 0

3+ 2 3

2 0 0

3 0 0

sample output

case 1:

*+xy-/a2

x+y*-a/2

xy+a2/-*

case 2:

+232+3

23+

judge tips

測試序列1對應的二叉樹如圖:

#include 

#include

using

namespace std;

class node

};//先序遍歷

void ppreorder(node*root)

//中序遍歷

void pinorder(node*root)

//後序遍歷

void paforder(node*root)

int main()

//構造二叉樹

for(int j=1; j<=n; j++)

cout<<"case "

<<(order-t)<<":"

coutcoutdelete  aleft;

delete  aright;

cout<

}return 0;

}

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...