Leetcode-102.二叉树的层次遍历

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

解法1:递归

最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下:

输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。
将当前节点插入到对应层的列表 levels[level] 中。
递归非空的孩子节点:helper(node.left / node.right, level + 1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
private:
vector<int> temp;
vector<vector<int>> res;
public:
vector<vector<int>> levelOrder(TreeNode* root) {
levelfind(root,0);
return res;
}
void levelfind(TreeNode *root,int height)
{
if(root!=NULL)
{
if(height>=res.size())
res.push_back(temp);
res[height].push_back(root->val);
levelfind(root->left,height+1);
levelfind(root->right,height+1);
}
}
};

解法2:迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
private:
vector<vector<int>> res;
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==NULL)
return res;
queue<TreeNode *>q;
TreeNode *p;
q.push(root);
while(!q.empty())
{
vector<int> temp;
int n=q.size();
for(int i=0;i<n;i++)
{
p=q.front();
temp.push_back(p->val);
q.pop();
if(p->left!=NULL) q.push(p->left);
if(p->right!=NULL) q.push(p->right);
}
res.push_back(temp);
}
return res;
}
};