102. Binary Tree Level Order Traversal (DFS的方法可以多看几遍)

仅供自己学习

 

思路:

BFS: 看到这题就会有一个疑问,当往下后结点越来越多要怎么在只加入root->left和root->right的情况下获得一层所有的结点呢。考虑到用一个数据结构存储,每次取出一个就加入取出的结点的左右子树进数据结构并且位于最后,由此考虑到用队列。那这样就有一个问题,我们怎么区分在队列中的哪些元素是同一层的呢?因为用了队列来存储,那么队列存储过的所有结点组成一棵树,那么循环条件便是队列非空,并且循环次数等于树的节点数,如果循环的时候用一个数记录一层的元素数,并且在循环中在使用一个内循环,用该数来限定内循环的循环次数,当内循环结束时该层就遍历结束,而内循环的过程会用一个vector存储结点的value,结束后则加入到结果的二维数组里面。而结束一层的遍历后,此时的队列的长度刚好是下一层的结点数,此时再求队列长度用来限制循环次数就能区分队列中的哪些元素属于同一层的了。

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<vector<int>> levelOrder(TreeNode* root) {
13         if(root==NULL) return {};
14         vector<vector<int>> res;
15         queue<TreeNode*> q;
16         q.push(root);
17         while(!q.empty()){
18             vector<int> level;
19             for(int i=q.size();i>0;--i){
20                 TreeNode* node = q.front(); q.pop();
21                 level.push_back(node->val);
22                 if(node->left)q.push(node->left);
23                 if(node->right)q.push(node->right);
24             }
25             res.push_back(level);
26 
27         }
28         return res;
29 
30     }
31 };

 

DFS:这里的话才用递归的方法,这里有个技巧,就是使用一个level来记录搜索的深度,如果我们一直搜索下去,深度和res这个二维数组的里面的一维数组的个数是一直相同的那么我们就在 level和res的长度相同时就添加一个空的一维数组,那么我们就在二维数组中创建出了和树层数相同的一维数组数,当创建一个一维数组,就将访问的左子树加入进去,而且同时我们开始是一只搜索左子树,那么返回的时候再搜索右子树即可,那么右子树也应该重复上述步骤,但是因为之前一直访问的左子树让level小于了搜索右子树而传入的res,因为此时res的一维数组数为树的总层数,而传入的level是小于的,所以不会再创建新的一维数组,只会根据level来找它应该处于的层数也就是应该属于第几个一维数组。

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<vector<int>> levelOrder(TreeNode* root) {
13         if(root==NULL) return {};
14         vector<vector<int>> res;
15         DFS(0,res,root);
16         
17         return res;
18     }
19     void DFS(int level,vector<vector<int>>& res,TreeNode* root){
20         if(root==NULL) return;
21         if(level==res.size()) res.push_back({});
22         res[level].push_back(root->val);
23         DFS(level+1,res,root->left);
24         DFS(level+1,res,root->right);
25     }
26 };

 

posted @ 2021-02-09 21:10  Mrsdwang  阅读(41)  评论(0)    收藏  举报