二叉树的按层遍历

题目:

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。


解题思路:

1.新建一个队列,将头结点压入队列。2个变量,last和nlast。last表示当前行的最右节点,初始值为头节点。nlast表示下一行的最右节点,初始值为空。

2.从队列中弹出队头元素top,并将top加入list1(用来存储每层的树节点)中。当top的左孩子存在时,将top的左孩子加入队列,nlast=top的左孩子。当top的右孩子存在时,将top的右孩子加入队列,nlast=top的右孩子。当top=last时说明该换行了。

3.重复2直至队列为空。

注意的是题目要求按行来打印树,所以List<TreeNode> list1来存储每层的树节点。List<List<TreeNode>> list来存储整棵树的节点。当top=last,时将list1加入到list中,并新建list1。


Java代码:

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class TreePrinter {
    public int[][] printTree(TreeNode root) {
        /*
        1.需要一个队列,将头结点入队列。需要2个变量,last表示当前行的最右节点,nlast表示下一行的最右节点。
        last初始值为头结点,nlast初始值为null。
        2.将队列的元素top移除并打印,将top的左孩子入队,nlast更新,top的右孩子入队列,nlast持续更新。当top等于
        last时说明该换行了。令last=nalst.
        3.重复2的操作,直到队列为空。
        因为题目要求按层打印树,所以需要List<List<TreeNode>>。里边的尖括号用来存储一层的树,外边的尖括号用来存储
        各层的树。
        */
        if(root==null) return null;
        TreeNode last=root;
        TreeNode nlast=null;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();//队列用linkedlist,不用ArrayList。不然会出错
        List<List<TreeNode>> list=new ArrayList<List<TreeNode>>();
        List<TreeNode> list1=new ArrayList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty())
        {
            TreeNode top=queue.poll();//取出队头元素
            list1.add(top);
            if(top.left!=null)
                {
                queue.offer(top.left);
                nlast=top.left;
            }
             if(top.right!=null)
                 {
                 queue.offer(top.right);
                 nlast=top.right;
             }
            if(top==last)//说明要换行了
                {
                list.add(list1);
                list1=new ArrayList<TreeNode>();//注意将list1加入list后,list1要更新
                last=nlast;  
            }
            
        }
       int [][]res=new int[list.size()][] ;
        for(int i=0;i<list.size();i++)
            
        {
            res[i]=new int[list.get(i).size()];
            for(int j=0;j<list.get(i).size();j++)
            {
            res[i][j]=list.get(i).get(j).val;
        }
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值