木落长安rr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

二叉树的层次遍历使用队列来实现,很大程度上类似于求树的最大深度。

第一种解法:开始时当前结点数curLevelCount=1,nextLevelCount=0,根据curLevelCount来输入每一层的结点值,当其左右子树存在时,将左右子树存入队列,并nextLevelCount++,每弹出一个当前层的结点时,curLevelCount--,当其为0时,再创建一个新的vector。

C++:

 1 vector<vector<int>> levelOrder(TreeNode* root) {
 2         vector<vector<int>> res={};
 3         queue<TreeNode*> q;
 4         if(!root)
 5             return res;
 6         q.push(root);
 7         int curLevelCount=1,nextLevelCount=0;
 8         vector<int> temp={};
 9         while(!q.empty()){
10             TreeNode* cur=q.front();
11             temp.push_back(cur->val);
12             q.pop();
13             curLevelCount--;            
14             if(cur->left){
15                 q.push(cur->left);
16                 nextLevelCount++;
17             }
18             if(cur->right){
19                 q.push(cur->right);
20                 nextLevelCount++;
21             }
22             if(curLevelCount==0){
23                 res.push_back(temp);
24                 temp={};
25                 curLevelCount=nextLevelCount;
26                 nextLevelCount=0;
27             }
28         }
29         return res;
30     }

第二种方法不用参数计算每一层结点个数,利用for循环,每一层时利用队列的大小来计算每一层的结点数。两层循环嵌套,效率比较低。

 1 vector<vector<int>> levelOrder(TreeNode* root) {
 2         vector<vector<int>> res={};
 3         queue<TreeNode*> q;
 4         if(!root)
 5             return res;
 6         q.push(root);
 7         while(!q.empty()){
 8             vector<int> temp={};
 9             for(int i=q.size();i>0;i--){
10                 TreeNode* cur=q.front();
11                 temp.push_back(cur->val);
12                 q.pop();       
13                 if(cur->left)
14                     q.push(cur->left);
15                 if(cur->right)
16                     q.push(cur->right);
17             }
18             res.push_back(temp);
19         }
20         return res;
21     }

 

posted on 2019-04-05 15:54  木落长安rr  阅读(242)  评论(0编辑  收藏  举报