今日你如约而至了吗?互相监督打卡学习哦~上题:
题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
分析:
题目的意思其实就是对二叉树的层序遍历。
!!!!
此题实际为二叉树的广度遍历,广度遍历必须借助其他的数据结构队列才能进行,比如最常见的Queue
//(不能直接递归哦)
!!!!
我一开始想用迭代的思想,但是输出的结果有重复,用while循环,没有中间桥梁依旧会重复。
所以
1、设置一个中间缓存区(可以是ArrayList,Queue或者其他都可以,只是起一个暂时存储临时根结点的作用)存储临时根结点。
2、从缓存区中取出第一个结点,即为当前结点。
3、将当前结点的值存入列表中,在缓冲区中删除当前结点;
4、将当前结点的左结点和右结点分别存入缓冲区中。
5、重复步骤2~4,知道结束;
代码:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list1 = new ArrayList<>();
if(root==null)return list1; //初始化要判断!
ArrayList<TreeNode> list2 = new ArrayList<>(); //缓冲区
list2.add(root);
while(list2.size()!=0){
TreeNode temp = list2.get(0);
list2.remove(0);
list1.add(temp.val); //将当前结点的值存入列表中
if(temp.left!=null)list2.add(temp.left); //将左节点和右节点存入缓冲区中。
if(temp.right!=null)list2.add(temp.right);
}
return list1;
}
}
牛客运行通过
运行时间:18ms
运行内存:9160Kb
这里是借助了一个缓冲区,相当于增大了空间复杂度,但是不用缓冲区容易重复~~~。
再用Queue实现:因为Queue有先进先出的特点,而且可以直接取出并删除元素。
Queue中的一些用法:
添加元素:add(不推荐,报异常),offer(推荐)
add(E e) : 将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;
remove() :移除队首元素,若移除成功,则返回true;如果移除失败(队列为空),则会抛出异常;
offer(E e) :将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则返回false;
poll() :移除并获取队首元素,若成功,则返回队首元素;否则返回null;
peek() :获取队首元素,若成功,则返回队首元素;否则返回null
推荐使用后面三个,不会报异常。
代码:
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list1 = new ArrayList<>();
if(root==null)return list1;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode temp = queue.poll(); //取出第一个元素并删除
list1.add(temp.val);
if(temp.left!=null)queue.offer(temp.left); //将左右结点存入到队列中。
if(temp.right!=null)queue.offer(temp.right);
}
return list1;
}
}
牛客运行通过
运行时间:20ms
运行内存:9416Kb
二叉树的广度优先遍历是需要借助的,一般借助队列实现。
举一反三:按行从上到下打印二叉树
这个其实和上面一样需要借助队列,但同时还需要两个变量,一个记录当前行的个数,一个记录下一行的个数。
所以需要添加几个if判断语句即可实现。
欢迎各位互相监督学习哦~~