LeetCode | 102. 二叉树的层次遍历
原题(Medium):
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
思路:BFS
看到这题的时候,我思索了一会才得出要用队列BFS方式记录同层结点这个结论,脑子着实太迟钝了...... 想出来后就立马开始写代码:
1 vector<vector<int>> levelOrder(TreeNode* root) { 2 if (root == NULL) return vector<vector<int>>(); 3 vector<vector<int>> res; 4 vector<int> temp; 5 queue<TreeNode*> BFS; 6 BFS.push(root); 7 helper(res, temp, BFS, 1); 8 return res; 9 } 10 11 //负责递归 12 void helper(vector<vector<int>>& res, vector<int>& temp, queue<TreeNode*>& BFS, int size) 13 { 14 int tempSize = size; 15 size = 0; 16 while (tempSize != 0) 17 { 18 TreeNode *root = BFS.front(); 19 temp.push_back(root->val); 20 tempSize--; 21 BFS.pop(); 22 if (root->left != NULL) 23 { 24 BFS.push(root->left); 25 size++; 26 } 27 if (root->right != NULL) 28 { 29 BFS.push(root->right); 30 size++; 31 } 32 } 33 res.push_back(temp); 34 temp.clear(); 35 if (size != 0) 36 helper(res, temp, BFS, size); 37 else 38 return; 39 return; 40 }
有一说一,这段代码写得甚是难看,说明我的编程功底确实有待提升,虽然AC了,但不看效率的AC都是耍流氓......
在看了大佬优美的代码后,我醍醐灌顶,对自己的代码做出了一定的修改,我们在优化后的代码里简单的讲解一下思路:
1 vector<vector<int>> levelOrder(TreeNode* root) { 2 if (root == NULL) return vector<vector<int>>(); 3 vector<vector<int>> res; 4 queue<TreeNode*> BFS; 5 BFS.push(root); 6 //当队列为空时,才到树的最底层,停止循环 7 while (!BFS.empty()) 8 { 9 vector<int>temp; 10 //在每次循环里,当前队列大小的为该层的结点数 11 int len = BFS.size(); 12 //处理当前层的结点 13 while (len != 0) 14 { 15 //pop()无返回值 16 TreeNode *root = BFS.front(); 17 //同层结点值放入同一个数组 18 temp.push_back(root->val); 19 len--; 20 BFS.pop(); 21 //把其子节点加入队列 22 if (root->left) 23 BFS.push(root->left); 24 if (root->right) 25 BFS.push(root->right); 26 } 27 res.push_back(temp); 28 //此时当前层的结点已遍历完(len为0),开始下一轮循环,进入下一层 29 } 30 return res; 31 }