TZOJ 4767: 二叉树遍历

描述

 

 

给定一颗二叉树,要求输出对二叉树进行先序和后序遍历所得到的序列。本题假设二叉树的结点数不超过1000。

 

 

输入

 

 

输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替),比如输入:

1 2 3 4 0 0 5 -1得到的二叉树如下:

 

 

 

输出

 

 

对应每组输入数据,输出有两行,第一行为二叉树的先序序列,第二行为二叉树的后序序列。

 

 

样例输入

 

2
1 -1
1 2 3 4 0 0 5 -1

样例输出

 

1
1
1 2 4 3 5
4 2 5 3 1

提示

 

输出的每个节点值后有一个空格。

复制代码
#include <stdio.h>
#include <stdlib.h>
#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
    int val;
    struct TreeNode *left,*right;
};
 
struct TreeNode a[520];
int f; 
struct TreeNode* Creat(struct TreeNode* root)
{
    int k=0,i,j,n;
    while(scanf("%d",&n),n!=-1)
        a[k++].val=n;
    for(i=0,j=1;i<k;i++,j++)
    {
        if(i+j>=k||a[i+j].val==0) a[i].left=NULL;
        else a[i].left=&a[i+j];
        if(i+j+1>=k||a[i+j+1].val==0) a[i].right=NULL;
        else a[i].right=&a[i+j+1];
    }
    return &a[0];
}
void pretree(TreeNode *root)
{
    cout<<root->val<<" ";
    if(root->left)pretree(root->left);
    if(root->right)pretree(root->right);
}
void hx(TreeNode *root)
{
    if(root->left)hx(root->left);
    if(root->right)hx(root->right);
    cout<<root->val<<" ";
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        f = 1;
        struct TreeNode* root=NULL;
        root=Creat(root);
        pretree(root);
        cout<<endl; 
        f = 1;
        hx(root);
        cout<<endl;        
    }

    return 0;
}
复制代码

 

posted @   CRt0729  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示