zoukankan      html  css  js  c++  java
  • 45二叉树的锯齿形层次遍历(103)

    作者: 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

    返回锯齿形层次遍历如下:

    [

      [3],

      [20,9],

      [15,7]

    ]

    程序输出:

    3 20 9 15 7 

    可使用以下main函数:

    #include <iostream>

    #include <queue>

    #include <cstdlib>

    #include <cstring>

    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().zigzagLevelOrder(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>> zigzagLevelOrder(TreeNode* root) 
        {
            vector<vector<int>> res;
            if(!root)
                return res;
            queue<TreeNode*> Q;
            Q.push(root);
            int m=0;
            while(!Q.empty())
            {
                m++; 
                vector<int> temp;
                int len=Q.size();
                for(int i=0;i<len;i++)
                {
                    temp.push_back(Q.front()->val);
                    if(Q.front()->left)
                        Q.push(Q.front()->left);
                    if(Q.front()->right)
                        Q.push(Q.front()->right);
                    Q.pop();
                }
                if(m%2!=0)
                    res.push_back(temp);
                else 
                {
                    reverse(temp.begin(),temp.end());
                    res.push_back(temp);
                }
            }
            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().zigzagLevelOrder(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]<<" ";
        }
    }
  • 相关阅读:
    [每日一题系列] LeetCode 1071. 字符串的最大公因子
    [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
    git diff (19)
    WinDbg探究CLR底层(1)
    使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    转MySQL遇到的语法差异及解决方案
    批量拼脚本神器-NimbleText
    Visual Studio 2017中使用正则修改部分内容
    如何使用ILAsm与ILDasm修改.Net exe(dll)文件
    在Windows上安装Elasticsearch v5.4.2
  • 原文地址:https://www.cnblogs.com/zmmm/p/13632801.html
Copyright © 2011-2022 走看看