1.问题描述
2.问题分析
本题其实就是深度优先搜索和广度优先搜索
深度优先搜索主要理由递归,具体思路看代码
广度优先搜索主要是利用队列,我们定义一个队列,分别对每一层结点进行操作,整个BFS循环如下:
新建一个临时列表 tmp ,
用于存储当前层打印结果
;
当前层打印循环: 循环次数为当前层节点数(即队列长度,每一次队列长度其实就是某一层的元素的个数);
出队: 队首元素出队,记为 t;
打印: 将 t->val 添加至 tmp 尾部;
添加子节点: 若 t 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
将当前层结果 tmp 添加入 vec 。
返回值: 返回打印结果列表 vec 即可。
3.代码实现
3.1C++代码(BFS)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vec;
queue<TreeNode*> q;
if(root!=NULL)
q.push(root);
while(!q.empty())
{
vector<int> tem;
int len=q.size();//表示每一层的结点个数
for(int i=0;i<len;i++)
{
TreeNode *t=q.front();//返回队列中的第一个元素
tem.push_back(t->val);
q.pop();//既然第一个元素已经使用过了就出队
if(t->left!=NULL)
q.push(t->left);
if(t->right!=NULL)
q.push(t->right);
}
vec.push_back(tem);
}
return vec;
}
};
3.2Java代码(DFS)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private List<List<Integer>> ret;
public List<List<Integer>> levelOrder(TreeNode root) {
ret = new ArrayList<>();
dfs(0, root);
return ret;
}
private void dfs(int depth, TreeNode root) {
//递归出口
if (root == null) {
return;
}
if (ret.size() == depth) {
ret.add(new ArrayList<>());//每新进来一层就添加一个新的集合对象(仅仅添加一次)
}
ret.get(depth).add(root.val);
//每一层互补影响
dfs(depth + 1, root.left);
dfs(depth + 1, root.right);
}
}