码迷,mamicode.com
首页 > 其他好文 > 详细

【TOJ 1004】

时间:2018-05-06 22:54:47      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:main   turn   ++   需要   otto   printf   pre   i++   its   

描述

给定一颗二叉树,按照层次顺序遍历,但在遍历时从最底下开始,编写函数并将各层节点通过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;
}

 

【TOJ 1004】

标签:main   turn   ++   需要   otto   printf   pre   i++   its   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!