【TOJ 1004】

描述

给定一颗二叉树,按照层次顺序遍历,但在遍历时从最底下开始,编写函数并将各层节点通过vector返回。

二叉树节点类定义如下:

class TreeNode

{

public:

int val;

TreeNode *left;

TreeNode *right;

TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

题目部分代码已经完成,您只需要补充并提交以下函数(外部函数形式):

vector<vector<int> > levelOrderBottom(TreeNode *root);

输入

输入描述了一棵二叉树,使用若干个整数(不超过512)表示一棵二叉树顺序表示时的结点元素值,其中0表示二叉树对应结点为空,以-1结束。

输出

输出层次遍历的结果,每层一行,每行的元素用空格隔开。

样例输入

1 2 3 0 0 4 5 -1

样例输出

4 5
2 3
1

#include<bits/stdc++.h>
using namespace std;
class TreeNode
{
public:
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode*creat()
{
    int front=1,rear=0,x;
    TreeNode*qu[1005],*t,*root=NULL;
    while(scanf("%d",&x)!=EOF,x!=-1)
    {
        if(!x)
            t=NULL;
        else
        {
            t=(TreeNode*)malloc(sizeof(TreeNode));
            t->val=x;
            t->left=NULL;
            t->right=NULL;
        }
        qu[++rear]=t;
        if(rear==1)
            root=t;
        else
        {
            if(t&&qu[front])
            {
                if(rear%2==0)
                    qu[front]->left=t;
                else
                    qu[front]->right=t;
            }
            if(rear%2==1)
                front++;
        }
    }
    return root;
}
vector<vector<int> > levelOrderBottom(TreeNode *root)
{
    vector<vector<int> >vv;
    vector<int>v;
    stack<vector<int> >st;
    queue<TreeNode*>qu1,qu2;

    if(!root)
        return vv;    

    qu1.push(root);
    while(!qu1.empty()||!qu2.empty())
    {
        while(!qu1.empty())
        {
            TreeNode*t=qu1.front();
            qu1.pop();
            v.push_back(t->val);
            if(t->left)
                qu2.push(t->left);
            if(t->right)
                qu2.push(t->right);
        }    

        if(!v.empty())
        {

            st.push(v);
            v.clear();
        }
        while(!qu2.empty())
        {
            TreeNode*t=qu2.front();
            qu2.pop();
            v.push_back(t->val);
            if(t->left)
                qu1.push(t->left);
            if(t->right)
                qu1.push(t->right);
        }
        if(!v.empty())
        {
            st.push(v);
            v.clear();
        }
    }
    while(!st.empty())
    {
        v=st.top();
        st.pop();
        vv.push_back(v);
    }
    return vv;
}
int main()
{
    TreeNode*x=creat();
    vector<vector<int> >v=levelOrderBottom(x);
    int i,j;
    for(i=0;i<v.size();i++)
    {
        for(j=0;j<v[i].size();j++)
        {
            if(j==0)
                printf("%d",v[i][j]);
            else
                printf(" %d",v[i][j]);
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/kannyi/p/9000119.html

时间: 2024-10-08 21:06:35

【TOJ 1004】的相关文章

【TOJ 3089】玩叠骰子

Description 大家都玩过骰子吧,骰子一般都被用来赌博的工具,但是我们ACM的成员不一样.我们可以用骰子来编写出各种各样的题目,给广大爱好ACM的人锻炼思考问题的能力.看看骰子: 很熟悉吧o(∩_∩)o ~~~废话不多说我们看题:现在给你n个骰子,把他们规范的叠起来,叠好后会有一些骰子的面被遮住,现在问你怎么叠没被遮住的那些面的点数和最大?说明:叠的时候不能错开的叠,也就是说两个面要满满的叠住.并且叠在地上的那面也算被遮住的.Do you know? 上面这个叠法就不合法.骰子:每个面点

【TOJ 1743】集合运算(set集合并、交、差的运用)

Description 给定两个集合A和B的所有元素,计算它们的交.并.差集. Input 输入数据有多组,第一行为数据的组数T,接下来有2T行,每组数据占2行,每行有若干个整数,第一行的所有整数构成集合A,第二行的所有整数构成集合B,分别用空格分隔.A和B最多分别不超过100个元素. Output 输出A.B的交.并.差集中的所有元素(以递增顺序).每个集合占一行,数据元素之间用空格分隔. Sample Input  10 1 2 3 4 5 6 7 8 83 6 8 9 Sample Out

【TOJ 1224】数据结构练习题――后序遍历二叉树

Description 给定一颗二叉树,要求输出二叉树的深度以及后序遍历二叉树得到的序列.本题假设二叉树的结点数不超过1000. Input 输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树.每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理.二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替). Output 输出每棵二叉树的深度以及后序遍历二叉树得到

【TOJ 3955】NKU ACM足球赛(加权并查集)

描述 NKU ACM最近要举行足球赛,作为此次赛事的负责人,Lee要对报名人员进行分队.分队要遵循如下原则: 一个人不能加入多支队伍:不认识的人不能分在同一队:如果a和b认识,b和c认识,那么认为a和c也认识:每支队伍上限8人,下限5人:尽量使队伍满员.由于参赛人数很多,Lee表示无能为力,所以请你帮助Lee编程解决比赛有多少队伍. 输入 第一行输入两个整数,n和m,n(1<=n<=300000)代表报名人数,m(1<=m<=500000)代表关系数.接下来m行每行两个整数a(1&

【TOJ 5247】C++实验:时间和日期类

描述 用C++实现日期类CDate和时间类CTime,并在次基础上利用多继承实现日期时间类CDateTime,使其能输出样例信息. 主函数里的代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { int y, m, d, hh, mm, ss; while(cin>>y>>m>>d>>hh>>mm>>ss) { CDateTime dt(y,m,d,hh,mm,ss); dt.Print(); ((CDa

【TOJ 5253】C++实验:多继承

描述 定义以下类: 1个CPerson类,其属性有:姓名.性别和年龄. 2.从CPerson类派生出CStudent类,增加属性:学号.入学时间和入学成绩: 3.从CPerson类派生出CTeacher类,添加属性:职务.部门和工作时间: 4.由CStudent类派生出CGraduate类,添加属性:研究方向和导师: 5.由CGraduate和CTeacher共同派生出在职研究生类CGradonWork: 6.CDate为日期类. 每个类定义一个Print函数,输出其属性值,输出见样例. 主函数

【TOJ 5254】C++实验:继承中的构造函数和析构函数

描述 实现C++类Base和Derived,并编写相关构造函数和析构函数,使其能够输出样例信息. 主函数里的代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { Base *p = new Derived(1, 2); delete p; Base b; Derived d; return 0; } 输入 无 输出 输出样例信息. 样例输入 无 样例输出 Base Constructor 1Derived Constructor 2Derived Destructo

【TOJ 1449】Area of Circles II

描述 There are two circles on the plane. Now you must to calculate the area which they cover the plane. For example, in Figure 1, the area of the red region is the answer of this problem. 输入 The input contains multiple test cases. The first line contai

【TOJ 3242】FatMouse and Java Beans(dp)

描述 FatMouse is lucky enough for it found a rectangular box in a storehouse which contains his favorite food-JavaBeans.The box is splited into r*c cells, and in each cell there are some JavaBeans in it.The problem is to determine the maximum amount of