相比于我熟悉的深度优先搜索策略,宽度优先搜索代码如下。 这是层次遍历代码。
/** * 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>> levelOrder(TreeNode* root) { vector<vector<int>> result; if(!root) return result; queue<TreeNode*> q; q.push(root); while(!q.empty()){ vector<int> level; int size=q.size(); for(int i=0;i<size;i++){ TreeNode* t=q.front(); q.pop(); level.push_back(t->val); if(t->left){ q.push(t->left); } if(t->right){ q.push(t->right); } } result.push_back(level); } return result; } };上面是层次遍历代码,下面是把bfs结果都存进一个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: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; if(!root) return result; queue<TreeNode*> q; q.push(root); while(!q.empty()){ //vector<int> level; int size=q.size(); for(int i=0;i<size;i++){ TreeNode* t=q.front(); q.pop(); //level.push_back(t->val); result.push_back(t->val); if(t->left){ q.push(t->left); } if(t->right){ q.push(t->right); } } //result.push_back(level); } return result; } };下是用dfs实现层次遍历
vector<vector<int>> result; vector<vector<int>> levelOrderBottom(TreeNode* root) { if(!root) return result_final; bfs(root,0); return result; } void bfs(TreeNode* root,int level) { if(root==NULL) return; if(result.size()<level+1) result.push_back(vector<int>{}); result[level].push_back(root->val); bfs(root->left,level+1); bfs(root->right,level+1); }其中,最重要的是传递了level这个参数,然后让每个节点在对应的vector中存储 就是这一句很重要
result[level].push_back(root->val);