剑指 Offer 32 - II. 从上到下打印二叉树 II
个人思路
题意
树的层序遍历,leetcode使用二维vector,存储的时候略有不同
思路
个人思路
- 打包存储节点及其层数
- 优点是便于节点和层数的对应输出
- 缺点是不便于代码实现
- 二维vector是通过申请行空间实现的,较为繁琐
简便思路
- 获取当前层的所有节点,一次性push进一维vector
- 层序遍历时,每次插入下一层的所有节点
- 每层操作结束时,将一维vector存入二维vector中
注意
- vector必须事先申请一块行空间才可以在该行存放元素
- 可以采用每次申请一行空间或者用一维vector存放完一层数据之后,以行为单位添加
个人思路代码
/**
* 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:
struct Node{//结构体打包存储节点+层数
TreeNode* treenode;
int level;
Node(){}
};
queue<Node> q;
vector<vector<int> > vec;
vector<vector<int> > levelOrder(TreeNode* root) {
if(root == NULL){
return vec;
}
Node temp;
temp.treenode = root;
temp.level = 0;
q.push(temp);
while(!q.empty()){
temp = q.front();
q.pop();
TreeNode* temp_tn = temp.treenode;//存放结构体中的节点,方便表示
if(temp.level == vec.size())//vector增加一行
vec.push_back(vector<int>());
vec[temp.level].push_back(temp_tn->val);
cout << temp.level << " " << temp_tn->val << endl;
if(temp_tn->left != NULL){
Node left;
left.treenode = temp_tn->left;
left.level = temp.level + 1;
q.push(left);
}
if(temp_tn->right != NULL){
Node right;
right.treenode = temp_tn->right;
right.level = temp.level + 1;
q.push(right);
}
}
return vec;
}
};
较简便的思路
/**
* 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:
queue<TreeNode*> q;
vector<vector<int> > vec;
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL){
return vec;
}
q.push(root);
while(!q.empty()){
int len = q.size();
vector<int> temp;
for(int i = 0 ; i < len; ++i){
TreeNode* head = q.front();
q.pop();
temp.push_back(head->val);
if(head->left != NULL){
q.push(head->left);
}
if(head->right != NULL){
q.push(head->right);
}
}
if(temp.size() > 0){
vec.push_back(temp);
}
}
return vec;
}
};