二叉樹遍歷
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
28* 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個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...