题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
输入准备:
解题思路:将以上二叉树按照行打印,输出的正确结果应该是[[1], [2, 3], [4, 5, 6, 7], [8, 9]].可以借助两个集合list与tempList去保存某一行的所有行结点(如第二行的【2,3】),保存list集合中的每一个结点的val,然后将list集合赋值为其子节点(list变为【4,5,6,7】),直到list集合为null,停止。
代码如下:
private static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrayList = new ArrayList<ArrayList<Integer>>();
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
if (pRoot==null) {
return arrayList;
}
list.add(pRoot); //list集合从根节点开始
while (list.size()>0) { //判断集合是否为null
ArrayList<TreeNode> tempList = new ArrayList<TreeNode>();
ArrayList<Integer> listArrayList = new ArrayList<Integer>();
for (int i = 0; i < list.size(); i++) {
listArrayList.add(list.get(i).val); //将遍历list集合,将集合中的所有结点的val值保存
if (list.get(i).left!=null) {
tempList.add(list.get(i).left); //先通过临时集合保存下一行所有的结点
}
if (list.get(i).right!=null) {
tempList.add(list.get(i).right);
}
}
arrayList.add(listArrayList); //将行val值集合 保存到 输出集合arrayList中
list = tempList;
}
return arrayList;
}
附上牛客网上大牛的代码,使用递归做的。
链接:https://www.nowcoder.com/questionTerminal/445c44d982d04483b04a54f298796288?f=discussion
来源:牛客网
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
depth(pRoot, 1, list);
return list;
}
private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
if(root == null) return;
if(depth > list.size())
list.add(new ArrayList<Integer>());
list.get(depth -1).add(root.val);
depth(root.left, depth + 1, list);
depth(root.right, depth + 1, list);
}
}
总结
采用递归的方法简洁明了,是第一种方法的精简版。在二叉树的算法题中,递归的方法需要运用熟练,对递归出口一定要判断准确。