zoukankan      html  css  js  c++  java
  • 42二叉树的层次遍历 II(107)

    作者: Turbo时间限制: 1S章节: DS:树

    晚于: 2020-08-05 12:00:00后提交分数乘系数50%

    截止日期: 2020-08-12 12:00:00

    问题描述 :

    给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    例如:

    给定二叉树 [3,9,20,null,null,15,7],

        3

       /

      9  20

         / 

       15   7

    返回其自底向上的层次遍历为:

    [

      [15,7],

      [9,20],

      [3]

    ]

    程序输出为:

    15 7 9 20 3

    可使用以下main函数:

    #include <iostream>

    #include <queue>

    #include <cstdlib>

    #include <cstring>

    #include <algorithm>

    using namespace std;

    struct TreeNode

    {

        int val;

        TreeNode *left;

        TreeNode *right;

        TreeNode() : val(0), left(NULL), right(NULL) {}

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

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

    };

    TreeNode* inputTree()

    {

        int n,count=0;

        char item[100];

        cin>>n;

        if (n==0)

            return NULL;

        cin>>item;

        TreeNode* root = new TreeNode(atoi(item));

        count++;

        queue<TreeNode*> nodeQueue;

        nodeQueue.push(root);

        while (count<n)

        {

            TreeNode* node = nodeQueue.front();

            nodeQueue.pop();

            cin>>item;

            count++;

            if (strcmp(item,"null")!=0)

            {

                int leftNumber = atoi(item);

                node->left = new TreeNode(leftNumber);

                nodeQueue.push(node->left);

            }

            if (count==n)

                break;

            cin>>item;

            count++;

            if (strcmp(item,"null")!=0)

            {

                int rightNumber = atoi(item);

                node->right = new TreeNode(rightNumber);

                nodeQueue.push(node->right);

            }

        }

        return root;

    }

    int main()

    {

        TreeNode* root;

        root=inputTree();

        vector<vector<int> > res=Solution().levelOrderBottom(root);

        for(int i=0; i<res.size(); i++)

        {

            vector<int> v=res[i];

            for(int j=0; j<v.size(); j++)

                cout<<v[j]<<" ";

        }

    }

    输入说明 :

    首先输入结点的数目n(注意,这里的结点包括题中的null空结点)

    然后输入n个结点的数据,需要填充为空的结点,输入null。

    输出说明 :

    输出结果,每个数据的后面跟一个空格。

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <queue>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode() : val(0), left(NULL), right(NULL) {}
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
        TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    };
    class Solution {
    public:
        vector<vector<int>> levelOrderBottom(TreeNode* root) 
        {
            vector<vector<int>> res;
            if(!root)
                return res;
            queue<TreeNode*> Q;
            Q.push(root);
            while(!Q.empty())
            {
                vector<int> temp;
                int len=Q.size();
                for(int i=0;i<len;i++)
                {
                    temp.push_back(Q.front()->val);
                //    cout<<Q.front()->val<<endl;
                    if(Q.front()->left)
                        Q.push(Q.front()->left);
                    if(Q.front()->right)
                        Q.push(Q.front()->right);
                    Q.pop();
                }
                res.push_back(temp);
            }
            reverse(res.begin(),res.end());
            return res;
        }
    };
    
    TreeNode* inputTree()
    {
        int n,count=0;
        char item[100];
        cin>>n;
        if (n==0)
            return NULL;
        cin>>item;
        TreeNode* root = new TreeNode(atoi(item));
        count++;
        queue<TreeNode*> nodeQueue;
        nodeQueue.push(root);
        while (count<n)
        {
            TreeNode* node = nodeQueue.front();
            nodeQueue.pop();
            cin>>item;
            count++;
            if (strcmp(item,"null")!=0)
            {
                int leftNumber = atoi(item);
                node->left = new TreeNode(leftNumber);
                nodeQueue.push(node->left);
            }
            if (count==n)
                break;
            cin>>item;
            count++;
            if (strcmp(item,"null")!=0)
            {
                int rightNumber = atoi(item);
                node->right = new TreeNode(rightNumber);
                nodeQueue.push(node->right);
            }
        }
        return root;
    }
    
    int main()
    {
        TreeNode* root;
        root=inputTree();
        vector<vector<int> > res=Solution().levelOrderBottom(root);
        for(int i=0; i<res.size(); i++)
        {
            vector<int> v=res[i];
            for(int j=0; j<v.size(); j++)
                cout<<v[j]<<" ";
        }
    }
  • 相关阅读:
    100行代码实现了多线程,批量写入,文件分块的日志方法
    阿里云客户端开发技巧
    阿里云客户端的实现(支持文件分块,断点续传,进度,速度,倒计时显示)
    类库间无项目引用时,在编译时拷贝DLL
    数据库-锁的实践
    Node.js学习资料
    文档流转,文档操作,文档归档(一)
    滑动验证码研究-后续
    iTextSharp 116秒处理6G的文件
    在职场中混,"讲演稿"的重要性
  • 原文地址:https://www.cnblogs.com/zmmm/p/13629889.html
Copyright © 2011-2022 走看看