二叉树的锯齿形层次遍历
问题描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [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。
输出说明
输出结果,每个数据的后面跟一个空格。
输入范例
7
3 9 20 null null 15 7
输出范例
3 20 9 15 7
实现思路
对树进行层次遍历,只需要多一步操作:用一个变量记录遍历的是哪一层的数据,若为偶数则要将遍历该层得到的一维数组进行reverse。
实现代码
#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;}class Solution{
public:vector<vector<int>> zigzagLevelOrder(TreeNode *root){vector<vector<int>> res;queue<TreeNode *>q;int i = 0;//记录是哪一层,若为偶数层则将该层数据reverseif(root!=NULL)q.push(root);while(!q.empty()){i++;int len = q.size();vector<int>tem;while(len){TreeNode *p = q.front();q.pop();tem.push_back(p->val);if(p->left) q.push(p->left);if(p->right) q.push(p->right);len--;}if(i%2==0){reverse(tem.begin(),tem.end());}res.push_back(tem);}return res;}
};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]<<" ";}}