<剑指offer>把二叉树打印成多行(中等)

本文介绍了一种实现二叉树层序遍历的方法,采用层次遍历结合队列的方式,确保每层节点从左至右输出,并将结果保存在二维数组中返回。文章还分享了一个关于数组对象引用的问题及解决方案。

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

描述

给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。

例如:
给定的二叉树是{1,2,3,#,#,4,5}


该二叉树多行打印层序遍历的结果是

[

[1],

[2,3],

[4,5]

]

数据范围:二叉树的节点数 0 \le n \le 10000≤n≤1000,0 \le val \le 10000≤val≤1000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

输入描述:

给定一个二叉树的根节点

 

思路:层次遍历+判断每一层的结点是否遍历完毕

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.*;
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode root) {
        
        ArrayList<ArrayList<Integer>> ans = new ArrayList();
        
        if(root == null)
            return ans;
        LinkedList<TreeNode> queue = new LinkedList();
        queue.offer(root);
        TreeNode p = null;
        //flag1记录本层父节点是否全部弹出,flag2记录儿子节点的数量
        int flag1 = 1;
        int flag2 = 0;
        ArrayList<Integer> a = new ArrayList();
        while(!queue.isEmpty()){
            p = queue.poll();
            a.add(p.val);
            if(p.left != null){
                queue.offer(p.left);
                flag2++;
            }
            if(p.right != null){
                queue.offer(p.right);
                flag2++;
            }
            //结点弹出,代表当前层结点数量的flag1--;
            flag1--;
            //通过flag1是否为0判断当前层节点是否遍历完
            if(flag1 == 0){
                //准备下一层节点的遍历
                flag1 = flag2;
                flag2 = 0;
                //将存有一层节点值的数组链表a存入ans中
                ans.add(a);
                //新建a,为存入新一层节点的值做准备
                a = new ArrayList();
            }
        }
        return ans;
    }
}

遇到问题:

在将存储一层节点值的数组a存入ans中后,需要新建一个数组a来存储新的一层节点值。刚开始在ans.add(a)后用的a.clear(),本想清空后存入元素,再把数组a存入ans中,结果发现存入ans的多个a其实引用的是同一个对象,导致答案错误

解决方法:

在ans.add(a)后使用a = new ArrayList()可以新建一个数组a,这个数组a和之前的数组a是两个不同的对象,问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值