题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
关键在于层序遍历的变换
我们知道层序遍历就是从上到下,从左到右,一层一层的遍历,层序遍历算法如下:
1、判断根节点不为空,push进队列中
2、判断队列为空,结束,不为空进入3
3、pop队列中首元素,将首元素中左右子树不为空的节点加入队列中,重复2,3
而采取之字型打印关键在于,
1、一次循环,遍历整层元素
2、保存下一层需要遍历的元素
实现如下:
#pragma once
#include <vector>
using namespace std;
namespace this_two_tree
{
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ret;
if (pRoot == nullptr)
return ret;
vector<TreeNode*> que;
que.push_back(pRoot);
bool left = true;
while (!que.empty())
{
vector<int> layer;
int size = que.size();
for (int i = 0; i < size; i++)
{
layer.push_back(que[i]->val);
}
ret.push_back(layer);
vector<TreeNode*> tmp;
for (int i = size - 1; i >= 0; i--)
{
if (left)
{
if (que[i]->right != nullptr)
{
tmp.push_back(que[i]->right);
}
if (que[i]->left != nullptr)
{
tmp.push_back(que[i]->left);
}
}
else
{
if (que[i]->left != nullptr)
{
tmp.push_back(que[i]->left);
}
if (que[i]->right != nullptr)
{
tmp.push_back(que[i]->right);
}
}
}
left = !left;
que.clear();
que.insert(que.begin(), tmp.begin(), tmp.end());
}
return ret;
}
};
}
test.cpp
#pragma once
#include "this_two_tree.h"
using namespace this_two_tree;
void start_test()
{
this_two_tree::Solution s;
TreeNode* n1 = new TreeNode(2);
TreeNode* n2 = new TreeNode(3);
TreeNode* n3 = new TreeNode(4);
TreeNode* n4 = new TreeNode(5);
TreeNode* n5 = new TreeNode(6);
TreeNode* n6 = new TreeNode(7);
n1->left = n2;
n1->right = n3;
n3->left = n4;
n3->right = n5;
n4->left = n6;
auto ret = s.Print(n1);
}