一、二叉树的层序遍历
1、题目内容
2、题目分析
像这样一层层向下打印,用队列保存值输出即可
3、代码分析
public List<List<Integer>> levelOrder(TreeNode root) {
//输出最终结果的list
List<List<Integer>> list=new ArrayList<List<Integer>>();
//如果是空树,则直接返回空列表
if(root==null)
return list;
//为了方便接下来调用节点的左右孩子,这里将队列设置成TreeNode类型
Queue<TreeNode> queue=new LinkedList<TreeNode>();
//首先将根节点放入队列
queue.offer(root);
//以队列是否为空作为循环进行的条件
while(!queue.isEmpty())
{
//获取当前队列的size
int size=queue.size();
List<Integer> templist=new ArrayList<Integer>();
for(int i=0;i<size;i++)
{
//获取当前头结点,并将其从队列中移除
TreeNode a=queue.poll();
//在临时列表中,放入刚取走的节点的数值
templist.add(a.val);
//判断左右节点,不空则放入,重复操作
if(a.left!=null)
queue.offer(a.left);
if(a.right!=null)
queue.offer(a.right);
}
//一次for循环结束,代表结束了一层
list.add(templist);
}
return list;
}
二、二叉树的锯齿状层序遍历
1、题目内容
2、题目分析
只需要在上一题的基础上加上是那一层的判断即可,我们可以看到偶数层都是从右往左,奇数层都是从左往右,这样用一个变量限制一下即可.这里需要注意的是列表中add元素的时候,可以通过指定下标添加,也就是我们想添加到第一位只需要在添加元素前加上0即可。
3、代码分析
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> list=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
if(root==null)
return list;
queue.offer(root);
int cnt=0;
while(!queue.isEmpty())
{
List<Integer> templist=new ArrayList<>();
int size=queue.size();
for(int i=0;i<size;i++)
{
TreeNode top=queue.poll();
if(cnt%2==0)
templist.add(top.val);
else
templist.add(0,top.val);
if(top.left!=null)
queue.offer(top.left);
if(top.right!=null)
queue.offer(top.right);
}
cnt++;
list.add(new ArrayList<>(templist));
}
return list;
}