题目
分词:很明显是层次遍历,与图里的 BFS 很像,只是不用设置 visited 标志变量。只是稍微有点难度的是要分别输出每一层的变量,我最初的想法使用队列存储所有节点,是对每一层的节点都计数,只是这样子代码写起来稍微有点麻烦,后来才知道可以在while 循环中再加一层 for 循环解决,while 循环判断队列是否为空,该层 for 循环输出该层的所有节点。 代码如下:
基于计数:
vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> ret; if(root == NULL){ return ret; } queue<TreeNode*> q; vector<int> layer; q.push(root); layer.push_back(root->val); ret.push_back(layer); int cnt = 0; int num = 1; int num2 = 0; layer.clear(); while(!q.empty()){ if(cnt < num){ cnt++; TreeNode* tmp = q.front(); q.pop(); if (tmp->left){ layer.push_back(tmp->left->val); num2++; q.push(tmp->left); } if(tmp->right){ layer.push_back(tmp->right->val); num2++; q.push(tmp->right); } } else{ ret.push_back(layer); layer.clear(); cnt = 0; num = num2; num2 = 0; } } return ret; }基于 for 循环
vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> ret; //需不需要做判断? if(root == NULL){ return ret; } queue<TreeNode*> q; q.push(root); vector<int> layer; layer.push_back(root->val); while(!q.empty()){ ret.push_back(layer); layer.clear(); int len_layer = q.size(); for(int i = 0; i < len_layer; ++i){ TreeNode* tmp = q.front(); q.pop(); if(tmp->left){ q.push(tmp->left); layer.push_back(tmp->left->val); } if(tmp->right){ q.push(tmp->right); layer.push_back(tmp->right->val); } } } return ret; }看了别人的代码,发现用 DFS 也可以解决,下次有机会的话再写吧。
