给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
思路:
借用队列,这道题目因为要求用二位vector进行处理,并且每行vector是装下一层的,所以必须对层序遍历里放一个一层的while循环
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> myvec;
queue<TreeNode*> q;
TreeNode * tmp=root;
if (tmp==NULL)
return myvec;
int level=0;
q.push(tmp);
while(!q.empty())
{
vector<int> tmpvec;
int size=q.size();
while(size--)//这里加一个while,保证每个vec行向量是一层
{
tmp=q.front();
tmpvec.push_back(tmp->val);
q.pop();
if (tmp->left)
q.push(tmp->left);
if(tmp->right)
q.push(tmp->right);
}
myvec.push_back(tmpvec);
}
return myvec;
}
int main()
{
TreeNode *root=&TreeNode(1);
root->left=&TreeNode(2);
root->right=&TreeNode(3);
root->left->left=&TreeNode(4);
root->left->right=&TreeNode(5);
root->right->left=&TreeNode(6);
root->right->right=&TreeNode(7);
root->left->left->left=&TreeNode(8);
root->left->right->right=&TreeNode(9);
root->right->left->right=&TreeNode(10);
vector<vector<int>> myvec;
myvec=levelOrder(root);
for (int j=0;j<myvec.size();j++)
{
for(int i=0;i<myvec[j].size();i++)
cout<<" "<<myvec[j][i];
cout<<endl;
}
return 0;
}
107题:
反过来用reverse函数就好,头文件algorithm
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> myvec;
queue<TreeNode*> q;
TreeNode * tmp=root;
if (tmp==NULL)
return myvec;
int level=0;
q.push(tmp);
while(!q.empty())
{
vector<int> tmpvec;
int size=q.size();
while(size--)
{
tmp=q.front();
tmpvec.push_back(tmp->val);
q.pop();
if (tmp->left)
q.push(tmp->left);
if(tmp->right)
q.push(tmp->right);
}
myvec.push_back(tmpvec);
}
reverse(myvec.begin(),myvec.end());//这一句翻转
return myvec;
}
};