给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。
输入
输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个…,如果某个结点不存在以0代替),比如输入:
1 2 0 3 4 -1得到的二叉树如下:
输出
输出每棵二叉树的深度以及先序遍历二叉树得到的序列。
样例输入
2 1 -1 1 2 0 3 4 -1
样例输出
1 1 3 1 2 3 4
#include<iostream> #define MaxSize 1001 int q[MaxSize], i=0; using namespace std; struct BTNode { int data; BTNode* lchild; BTNode* rchild; }; class BTNodeClass { private: BTNode* r; void Release(BTNode* root); public: BTNodeClass(); ~BTNodeClass(); void CreateBTNode(BTNode* &p, int a); int BTNodeHeight(BTNode* &p); void PreOrder(BTNode* &p); }; BTNodeClass::BTNodeClass() { r = NULL; } BTNodeClass::~BTNodeClass() { } void BTNodeClass::CreateBTNode(BTNode* &p,int a) { if (r == NULL) r=p; if (a > i || q[a] == 0) { p = NULL; return; } else{ p = new BTNode(); p->data = q[a]; CreateBTNode(p->lchild, 2 * a); CreateBTNode(p->rchild, 2 * a + 1); } } int BTNodeClass::BTNodeHeight(BTNode* &p) { int lchildh=0, rchildh=0; if (p == NULL) return 0; else { lchildh = BTNodeHeight(p->lchild); rchildh = BTNodeHeight(p->rchild); return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1); } } void BTNodeClass::PreOrder(BTNode* &p) { if (p != NULL) { cout << " " << p->data; PreOrder(p->lchild); PreOrder(p->rchild); } } int main(){ int n; cin >> n; while (n--) { int a; BTNodeClass tree; while (cin >> a) { if (a == -1) break; else { q[++i]=a; } } BTNode* p; tree.CreateBTNode(p, 1); cout <<tree.BTNodeHeight(p); tree.PreOrder(p); cout << endl; i = 0; } return 0; }