ACM题目————二叉树的遍历

一、二叉树的后序遍历:

题目描述

给定一颗二叉树,要求输出二叉树的深度以及后序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000

输入

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

输出

输出每棵二叉树的深度以及后序遍历二叉树得到的序列。

样例输入

2
1 -1
1 2 0 3 4 -1

样例输出

1 1

3 3 4 2 1

//Asimple
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 1005;
int n, T, num, cnt, point, line, x, y, t;
bool flag;

typedef struct node
{
    int data ;
    struct node *lchild, *rchild;
}BiNode, *BiTree;

BiTree *q[maxn];

int Deepth(BiTree T)
{
    if( T == NULL ) return 0 ;
    int x = Deepth(T->lchild);
    int y = Deepth(T->rchild);
    return max(x,y)+1 ;
}

void Hou_Print(BiTree T)
{
    if( T == NULL ) return ;
    Hou_Print(T->lchild);
    Hou_Print(T->rchild);
    cout << " " << T->data ;
}

int main()
{
    BiTree u, v, root;
    int f, r;
    cin >> T ;
    while( T -- )
    {
        flag = true ;
        f = r = 0 ;
        while( scanf("%d",&num)&&num!=-1)//建树
        {
            if( flag )//头节点
            {
                root = (BiTree)malloc(sizeof(BiNode));
                root->data = num ;
                root->lchild = root->rchild = NULL ;
                if( root->data == 0 )
                {
                    root = NULL ;
                    cout << "0 0" << endl ;
                    break;
                }
                q[r++] = &root->lchild;
                q[r++] = &root->rchild;
                flag = false ;
            }
            else
            {
                u = (BiTree)malloc(sizeof(BiNode));
                u->data = num ;
                u->lchild = u->rchild = NULL ;
                if( u->data != 0 )
                {
                    q[r++] = &u->lchild;
                    q[r++] = &u->rchild;
                }
                else u = NULL ;
                *q[f++] = u ;
            }
        }
        cnt = Deepth(root);
        cout << cnt ;
        Hou_Print(root);
        cout << endl ;
    }

    return 0;
}

二、中序遍历二叉树

题目描述

给定一颗二叉树,要求输出二叉树的深度以及中序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。

输入

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

输出

输出每棵二叉树的深度以及中序遍历二叉树得到的序列。

样例输入

2
1 -1
1 2 0 3 4 -1

样例输出

1 1

3 3 2 4 1

//Asimple
#include <stdio.h>
#include <iostream>

using namespace std;const int maxn = 1005;
int n, T, num, cnt, point, line, x, y, t;
bool flag;

typedef struct node
{
    int data ;
    struct node *lchild, *rchild;
}BiNode, *BiTree;

BiTree *q[maxn];

int Deepth(BiTree T)
{
    if( T == NULL ) return 0 ;
    int x = Deepth(T->lchild);
    int y = Deepth(T->rchild);
    return max(x,y)+1 ;
}

void Zhong_Print(BiTree T)
{
    if( T == NULL ) return ;
    Zhong_Print(T->lchild);
    cout << " " << T->data ;
    Zhong_Print(T->rchild);
}

int main()
{
    BiTree u, v, root;
    int f, r;
    cin >> T ;
    while( T -- )
    {
        flag = true ;
        f = r = 0 ;
        while( scanf("%d",&num)&&num!=-1)//建树
        {
            if( flag )//头节点
            {
                root = (BiTree)malloc(sizeof(BiNode));
                root->data = num ;
                root->lchild = root->rchild = NULL ;
                if( root->data == 0 )
                {
                    root = NULL ;
                    cout << "0 0" << endl ;
                    break;
                }
                q[r++] = &root->lchild;
                q[r++] = &root->rchild;
                flag = false ;
            }
            else
            {
                u = (BiTree)malloc(sizeof(BiNode));
                u->data = num ;
                u->lchild = u->rchild = NULL ;
                if( u->data != 0 )
                {
                    q[r++] = &u->lchild;
                    q[r++] = &u->rchild;
                }
                else u = NULL ;
                *q[f++] = u ;
            }
        }
        cnt = Deepth(root);
        cout << cnt ;
        Zhong_Print(root);
        cout << endl ;
    }

    return 0;
}

三、前序遍历:

题目描述

给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。

输入

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

输出

输出每棵二叉树的深度以及先序遍历二叉树得到的序列。

样例输入

2
1 -1
1 2 0 3 4 -1

样例输出

1 1

3 1 2 3 4

//Asimple
#include <stdio.h>
#include <iostream>

using namespace std;const int maxn = 1005;
int n, T, num, cnt, point, line, x, y, t;
bool flag;

typedef struct node
{
    int data ;
    struct node *lchild, *rchild;
}BiNode, *BiTree;

BiTree *q[maxn];

int Deepth(BiTree T)
{
    if( T == NULL ) return 0 ;
    int x = Deepth(T->lchild);
    int y = Deepth(T->rchild);
    return max(x,y)+1 ;
}

void Qian_Print(BiTree T)
{
    if( T == NULL ) return ;
    cout << " " << T->data ;
    Qian_Print(T->lchild);
    Qian_Print(T->rchild);
}

int main()
{
    BiTree u, v, root;
    int f, r;
    cin >> T ;
    while( T -- )
    {
        flag = true ;
        f = r = 0 ;
        while( scanf("%d",&num)&&num!=-1)//建树
        {
            if( flag )//头节点
            {
                root = (BiTree)malloc(sizeof(BiNode));
                root->data = num ;
                root->lchild = root->rchild = NULL ;
                if( root->data == 0 )
                {
                    root = NULL ;
                    cout << "0 0" << endl ;
                    break;
                }
                q[r++] = &root->lchild;
                q[r++] = &root->rchild;
                flag = false ;
            }
            else
            {
                u = (BiTree)malloc(sizeof(BiNode));
                u->data = num ;
                u->lchild = u->rchild = NULL ;
                if( u->data != 0 )
                {
                    q[r++] = &u->lchild;
                    q[r++] = &u->rchild;
                }
                else u = NULL ;
                *q[f++] = u ;
            }
        }
        cnt = Deepth(root);
        cout << cnt ;
        Qian_Print(root);
        cout << endl ;
    }

    return 0;
}

树。。

时间: 2024-10-10 07:49:23

ACM题目————二叉树的遍历的相关文章

ACM题目————二叉树最大宽度和高度

http://codevs.cn/problem/1501/ 题目描述 Description 给出一个二叉树,输出它的最大宽度和高度. 输入描述 Input Description 第一行一个整数n. 下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号.如果没有某个儿子为空,则为0. 输出描述 Output Description 输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开. 样例输入 Sample Input 5 2 3 4 5 0 0 0 0

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

超强的ACM题目类型总结

转:初期: 一.基本算法:       (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.       (4)递推.       (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:       (1)图的深度优先遍历和广度优先遍历.       (2)最短路径算法(dijkstra,bellman-

ACM 重建二叉树

重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGF BCAD

【LeetCode-面试算法经典-Java实现】【102-Binary Tree Level Order Traversal(二叉树层序遍历)】

[102-Binary Tree Level Order Traversal(二叉树层序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree {3,9,20,#,#,15

HLG 2040 二叉树的遍历 (二叉树遍历之间的转换)

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2040 Description: 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍历. 接下来的一行每行包括n个整数,表示这棵树的前序遍历. 3<= n <= 1

树、二叉树、遍历二叉树的总结

首先介绍树: 如上图所示就是一棵树,先介绍树的几个关键名词: 节点:A.B.C.D等都叫节点 节点的度:节点有几个分支,就叫节点的度,比如节点B有2个分支,那B的度为2 终端节点(叶子):没有分支的节点,如E.F.G.H 非终端节点:有分支的节点,如A.B.D.C 节点的层次:自上而下排列层次,A为1层,B为2层,D为3层 树的度:哪个节点的度最大,这个最大的度就是树的度,如图树的度为2 树的深度:简而言之,就是树有几层,如图的树的深度为4 我们接触最多的树是二叉树 二叉树:在计算机科学中,二叉

java生成二叉树和遍历

在java中实现二叉树和链表的方法都是在类中定义该类的对象引用 比如 class Tree { int data; Tree left; Tree right; } 这样的话当我们new一个Tree对象的时候,该对象就拥有了left和right两个对象,这样就起到了连接的 作用,在链表中就是连接了下一个,在树中就相当于边,这样就起到一个接一个的效果.总之,就是吧对象连接起来了. 下面是完整代码 package code; public class TwoTree { public static