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

45二叉树的锯齿形层次遍历(103)

时间:2020-09-17 18:32:43      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:zigzag   des   roo   层次遍历   atoi   NPU   script   dea   char   

作者: 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]<<" ";
    }
}

 

45二叉树的锯齿形层次遍历(103)

标签:zigzag   des   roo   层次遍历   atoi   NPU   script   dea   char   

原文地址:https://www.cnblogs.com/zmmm/p/13632801.html

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