跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
Java版剑指offer编程题第22题–从上往下打印二叉树: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
我的想法
- 实际上就是树的广度优先遍历,跟它对应的就是树的深度优先遍历,借助队列出现。
解题方法1
ArrayList<Integer> list = new ArrayList<>();
ArrayList<TreeNode1> queue = new ArrayList<>();
if (root == null) {
return list;
}
queue.add(root);
while (queue.size() != 0) {
TreeNode1 temp = queue.remove(0);
if (temp.left != null){
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
list.add(temp.val);
}
return list;
代码测试
package com.learnjiawa.jzoffer;
import javax.swing.tree.TreeNode;
import java.util.ArrayList;
/**
* @author learnjiawa
* 2019-12-23-21:40
*/
public class Solution22 {
public static void main(String[] args) {
//创建树A
TreeNode1 root = new TreeNode1(1);
TreeNode1 treeNode1_2 = new TreeNode1(2);
TreeNode1 treeNode1_3 = new TreeNode1(3);
TreeNode1 treeNode1_4 = new TreeNode1(4);
TreeNode1 treeNode1_5 = new TreeNode1(5);
TreeNode1 treeNode1_6 = new TreeNode1(6);
TreeNode1 treeNode1_7 = new TreeNode1(7);
root.left = treeNode1_2;
root.right = treeNode1_3;
treeNode1_2.left = treeNode1_4;
treeNode1_2.right = treeNode1_5;
treeNode1_3.left = treeNode1_6;
treeNode1_3.right = treeNode1_7;
ArrayList<Integer> list = PrintFromTopToBottom(root);
for(int num : list){
System.out.print(num + " ");
}
}
public static ArrayList<Integer> PrintFromTopToBottom(TreeNode1 root) {
//存返回结果
ArrayList<Integer> list = new ArrayList<>();
//辅助队列,保证按层次队列
ArrayList<TreeNode1> queue = new ArrayList<>();
if (root == null) {
return list;
}
queue.add(root);
while (queue.size() != 0) {
TreeNode1 temp = queue.remove(0);
if (temp.left != null){
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
//获得节点的值
list.add(temp.val);
}
return list;
}
}
代码测试控制台输出结果:
总结
树的广度优先遍历和深度优先遍历两种算法大家都要会哦。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,点个关注是对我最大的支持,持续更新中…
关注微信公众号LearnJava: