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 }

posted @ 2019-10-18 11:17  羽园原华  阅读(125)  评论(0编辑  收藏  举报