2018天梯賽第二次訓練(1)
阿新 • • 發佈:2018-12-31
1001 1002 1003是1004的一個方面,我直接放第四題了(TOJ4405)
1004 : 二叉樹遍歷
時間限制(普通/Java):1000MS/3000MS 記憶體限制:65536KByte總提交: 13 測試通過: 13
描述
給定一顆二叉樹,要求輸出遍歷該二叉樹得到的先序、中序、後序遍歷序列。本題假設二叉樹的結點數不超過1000。
輸入
輸入資料分為多組,第一行是測試資料的組數n,下面的n行分別代表一棵二叉樹。每棵二叉樹的結點均為正整數,資料為0代表當前結點為空,資料為-1代表二叉樹資料輸入結束,-1不作處理。二叉樹的構造按照層次順序(即第1層1個整數,第2層2個,第3層4個,第4層有8個......,如果某個結點不存在以0代替)
輸出
輸出每棵二叉樹的先序、中序、後序遍歷序列,每個序列佔一行。
樣例輸入
2
1 -1
1 2 3 4 5 0 6 -1
樣例輸出
1
1
1
1 2 4 5 3 6
4 2 5 1 3 6
4 5 2 6 3 1
提示
輸出的每個節點值前有一個空格。
二叉樹的基本內容。
#include<bits/stdc++.h> using namespace std; typedef struct BinaryTree { int data; BinaryTree *left, *right; }tree; tree a[2222]; int n; //int a[2222],n; /* void CreateTree(tree *&T, int k) //遞迴建立二叉樹 { if(a[k]==0||k>n) { T=NULL; return ; } else { T=(tree*)malloc(sizeof(tree)); T->data=a[k]; creat(T->left, 2*k); creat(T->right, 2*k+1); } return ; }*/ void visit(tree *b) { if(b->data!=0) printf(" %d", b->data); return ; } void PreOrderTraverse(tree *t) //先序遍歷遞迴演算法 { if (t){ visit(t); PreOrderTraverse(t->left); PreOrderTraverse(t->right); } return ; } void InOrderTraverse(tree *t) //中序遍歷遞迴演算法 { if (t){ InOrderTraverse(t->left); visit(t); InOrderTraverse(t->right); } return ; } void PostOrderTraverse(tree *t) //後序遍歷遞迴演算法 { if (t) { PostOrderTraverse(t->left); PostOrderTraverse(t->right); visit(t); } return ; } void LevelOrderTraverse(tree *t) //層序遍歷演算法 { queue<tree*>q; q.push(t); while(!q.empty()){ tree* t = q.front(); q.pop(); visit(t); if(t->left)q.push(t->left); if(t->right)q.push(t->right); } return ; } int main() { int T,k; while (~scanf("%d", &T)) { while (T--) { n = 0; while (scanf("%d", &k), k != -1) a[n++].data = k; k = 1; for (int j = 0;j < n;j++) { if (j + k >= n)a[j].left = NULL; else a[j].left = &a[j + k]; if (j + k + 1 >= n)a[j].right = NULL; else a[j].right = &a[j + k + 1]; k++; } PreOrderTraverse(a); printf("\n"); InOrderTraverse(a); printf("\n"); PostOrderTraverse(a); printf("\n"); LevelOrderTraverse(a); printf("\n"); } } return 0; }