1、思路

  • 模板题,就是二叉树的层序遍历和锯齿形遍历;

  • 输出比较麻烦。

2、代码

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left, *right;

    TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};

//建树
void createTree(TreeNode *root, int &n)
{
    int rootVal, leftVal, rightVal;
    cin >> rootVal >> leftVal >> rightVal;

    root->val = rootVal;

    if (leftVal != 0)
    {
        root->left = new TreeNode(leftVal);
        createTree(root->left, -- n);
    }

    if (rightVal != 0)
    {
        root->right = new TreeNode(rightVal);
        createTree(root->right, -- n);
    }
}

//层序遍历
void printByLevel(TreeNode *root)
{
    queue<TreeNode*> q;
    q.push(root);

    int level = 1;
    while (!q.empty())
    {
        int size = q.size();

        cout << "Level " << level << " : ";
        while (size -- )
        {
            TreeNode *cur = q.front();
            q.pop();

            cout << cur->val << " ";

            if (cur->left != nullptr) q.push(cur->left);
            if (cur->right != nullptr) q.push(cur->right);
        }

        ++ level;
        cout << endl;
    }
}

// Z 字形遍历
void printByZigZag(TreeNode *root)
{
    queue<TreeNode*> q;
    q.push(root);

    int level = 1;
    bool flag = true;

    while (!q.empty())
    {
        vector<int> tmp;
        int size = q.size();

        if (flag)
        {
            cout << "Level " << level << " from left to right: ";
        }
        else
        {
            cout << "Level " << level << " from right to left: ";
        }

        while (size -- )
        {
            TreeNode *cur = q.front();
            q.pop();
            tmp.push_back(cur->val);

            if (cur->left != nullptr) q.push(cur->left);
            if (cur->right != nullptr) q.push(cur->right);
        }

        if (!flag) reverse(tmp.begin(), tmp.end());     //反转当前层

        for (int num : tmp) cout << num << " ";
        cout << endl;

        flag ^= 1;
        ++ level;
    }
}

int main()
{
    int n, rootVal;
    cin >> n >> rootVal;

    TreeNode *root = new TreeNode(rootVal);
    createTree(root, n);

    printByLevel(root);
    printByZigZag(root);

    return 0;
}