赞
踩
BFS即可,借助队列。
此题的难点在于需要区分每一层的节点,所以我们入队的时候为每个节点都打上了标记(pair<TreeNode*, int>,第二位数字即为节点随身携带的标记),每一个节点对应的标记都是它的父节点的标记+1。
生成输出结果时方式其实很多,可以先一股脑全塞进vector里面,遍历结束再对vector细分即可,也可以选择使用哈希表进行维护(方便分类),不过我选择的是一边遍历一边生成结果,依据是节点的标记是否和上一个节点相同:
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> vec; //结果数组 vector<int> help; //辅助数组 if(!root) return vec; queue<pair<TreeNode*, int>> q; q.push({root, 0}); int flag = 0; while(!q.empty()){ auto tmp = q.front(); q.pop(); if(tmp.second != flag){ vec.push_back(help); help.clear(); flag = tmp.second; } help.push_back(tmp.first->val); if(tmp.first->left) q.push({tmp.first->left, tmp.second+1}); if(tmp.first->right) q.push({tmp.first->right, tmp.second+1}); } vec.push_back(help); return vec; } };
一次处理多个的思路(很巧)
也可以通过记录队列的长度来进行每一层的判断:
class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> vec; //结果数组 if(!root) return vec; queue<TreeNode*> q; q.push(root); while(!q.empty()){ int len = q.size(); vector<int> level; for(int i = 0; i < len; ++i){ //就相当于一次处理q的size()个 auto tmp = q.front(); q.pop(); level.push_back(tmp->val); if(tmp->left) q.push(tmp->left); if(tmp->right) q.push(tmp->right); } vec.push_back(level); } return vec; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。