剑指offer——从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

输入准备:在这里插入图片描述
解题思路:将以上二叉树按照行打印,输出的正确结果应该是[[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);
    }
}

总结

采用递归的方法简洁明了,是第一种方法的精简版。在二叉树的算法题中,递归的方法需要运用熟练,对递归出口一定要判断准确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值