题干:
一层一层的向下遍历二叉树,同一层的话再按照从左向右的顺序进行遍历即可。
思路:
别扯那么多,这就是二叉树的广度优先遍历:BFS。而广度优先遍历的精髓,或者说实现的原理就是队列,保证数据先进先出:先进左边节点、再进右边节点。从而输出就是先左边节点、再右边节点。
(补一句:DFS的核心思想,或者底层原理则是栈,先进后出:先进右节点,再进左节点即可)
具体代码如下:
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
Queue<TreeNode> quot = new LinkedList<TreeNode>();
ArrayList<Integer> list = new ArrayList<>();
if(root==null){
return list;
}
quot.add(root);
while(!quot.isEmpty()){
TreeNode t = quot.remove();
list.add(t.val);
if(t.left!=null){
quot.add(t.left);
}
if(t.right!=null){
quot.add(t.right);
}
}
return list;
}
拓展:
层次遍历二叉树,一行输出一层
思路还是BFS,只不过在一个地方有微小的不同,那就是需要将当前队列中的所有放置于一个list中,见下:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root==null){
return list;
}
queue.add(root);
ArrayList<Integer> list1 = new ArrayList<>();
while(!queue.isEmpty()){
for(int i=queue.size();i>0;i—){ //唯一的不同点
TreeNode t = queue.remove();
list1.add(t.val);
if(t.left!=null)queue.add(t.left);
if(t.right!=null)queue.add(t.right);
}
list.add(new ArrayList<>(list1));
list1.clear();
}
return list;
}
继续拓展,之字形打印二叉树,每一行在一个list内:
/*
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
思路有很多:直接设置flag、奇数行偶数行判断添加即可。偶数行加原list1,奇数行将list1反转后再添加
*/
public List<List<Integer>> levelOrder2(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root==null){
return list;
}
queue.add(root);
boolean flag=true;//偶数行
ArrayList<Integer> list1 = new ArrayList<>();
while (!queue.isEmpty()){
for(int i=queue.size();i>0;i--){
TreeNode t = queue.remove();
list1.add(t.val);
if(t.left!=null)queue.add(t.left);
if(t.right!=null)queue.add(t.right);
}
if(flag){
list.add(new ArrayList<>(list1));
list1.clear();
flag=!flag;
}
else {
Collections.reverse(list1);
list.add(new ArrayList<>(list1));
list1.clear();
flag=!flag;
}
}
return list;
}```
一道基础题,或者是简单题,一定要做到举一反三,才能有所收获!与君共勉~