二叉树遍历
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
描述
给定一颗二叉树,要求输出遍历该二叉树得到的先序、中序、后序遍历序列。
输入
输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替,总共不超过100)
输出
输出每棵二叉树的先序、中序、后序遍历序列,每个序列占一行。
样例输入
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提示
输出的每个节点值前有一个空格。
思路:用了结构体指针的方法按层建立二叉树,中间变换时建立一个队列来维护二叉树左右支建立。按层将每个数据依次存入队列,当左右子节点都不为NULL时将指针跳向下一个队列中的值。
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
typedef long long ll;
string s;
struct tree{
tree* left, * right;int val;
};
struct LinkNode {
tree* p; // 树中对应结点的地址
LinkNode* pNext;
};
int flag;
bool InitTree(tree *&T) {
T = NULL;
return true;
}
void createtree(tree* &T, LinkNode*& phead, LinkNode*& ptail, int val) {
tree* pTreeNew = (tree*)calloc(1, sizeof(tree)); // calloc为树结点申请空间初始化为0
LinkNode* pQueueNew = (LinkNode*)calloc(1, sizeof(LinkNode)); // calloc为队列结点申请空间初始化为0
LinkNode* pCur = phead;//始终指向当前操作位置
pTreeNew->val = val; //树节点赋值
pQueueNew->p = pTreeNew; //队列新节点即树新节点
if (T == NULL) { // 空树时,新结点置为树根
T = pTreeNew;
phead = pQueueNew;
ptail = pQueueNew;
}
else {
ptail->pNext = pQueueNew; //尾插法
ptail = pQueueNew; // 更新尾指针
if (pCur->p->left == NULL) { // 左孩子为空
pCur->p->left = pTreeNew;
}
else if (pCur->p->right == NULL) { //右孩子为空
pCur->p->right = pTreeNew;
phead = pCur->pNext;
free(pCur);
pCur = NULL;
}
}
}
void find1(tree *x)
{
if (x == NULL||x->val==0)
return;
cout << " " << x -> val;
find1(x->left);
find1(x->right);
}
void find2(tree* x)
{
if (x == NULL || x->val == 0)
return;
find2(x->left);
cout << " " << x->val;
find2(x->right);
}
void find3(tree* x)
{
if (x == NULL || x->val == 0)
return;
find3(x->left);
find3(x->right);
cout << " " << x->val;
}
int main()
{
int n;
cin >> n;
while (n--)
{
flag = 0;
tree* t;
InitTree(t);
LinkNode* phead = NULL;
LinkNode* ptail = NULL;
int x;
while (cin >> x, x != -1)
{
createtree(t,phead,ptail,x);
}
find1(t); cout << "\n";
find2(t); cout << "\n";
find3(t); cout << "\n";
}
return 0;
}