【剑指offer-60】20190909/03 把二叉树打印成多行

本文介绍了使用队列实现的二叉树层次遍历算法,以及递归实现的层次遍历方法。通过队列记录每层节点数,实现从上到下、从左至右的层次遍历。递归方法则通过深度参数跟踪层级,确保同层节点按顺序加入数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【剑指offer-60】把二叉树打印成多行

  • 考点:队列 树
  • 时间限制:1秒
  • 空间限制:32768K
  • 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路:

队列LinkedList完成层序遍历,用end记录每层结点数目

代码:
import java.util.ArrayList;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.Queue;
import java.util.LinkedList;

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList();
        if (pRoot == null) {
            return list;
        }
        
        Queue<TreeNode> queue = new LinkedList();
        queue.add(pRoot);
        
        ArrayList<Integer> temp = new ArrayList();
        int start = 0, end = 1;
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            temp.add(cur.val);
            start++;
            
            if (cur.left != null) {
                queue.offer(cur.left);
            }
            if (cur.right != null) {
                queue.offer(cur.right);
            }
            if (start == end) {
                end = queue.size();
                start = 0;
                list.add(temp);
                temp = new ArrayList();
            }
        }
        return list;
    }
    
}
我的问题:

这个就是层次遍历了,但是要注意一点,要求按层保存,所以我们要注意每一层的结尾在哪里。这个通过queue的size来保存,start指针记录走到哪一步。当start==end的时候,就是这一层走完了,重置start为0,并且end等于queue的size大小,也就是下一层所具有的的节点数。


其他思路1:

递归做法:
利用递归的方法进行先序遍历,传递深度,递归深入一层扩容一层数组,先序遍历又保证了同层节点按从左到右入数

假如现在元素是[1,2,3],当进入2时会创建一个 arraylist,此时 depth = 2,size=2;当2遍历完后会进入3,此时3 就不用创建 arraylist 了,因为 2,3是同一层的,并且此时 depth==size 。这个判断是用来让最左的元素创建 arraylist 就行了,而同一层后边的元素共用这个 arraylist

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 {
    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;
        }
        // 如果传入的深度大小大于list大小,说明当前层还没有创建list
        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、付费专栏及课程。

余额充值