剑指offer32.从上到下打印二叉树

题目

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

样例

例如:
给定二叉树: [3,9,20,null,null,15,7],

在这里插入图片描述

返回:

[3,9,20,15,7]

思路分析

层序遍历即可
层序遍历:通过定义一个队列先进先出,然后进行打印
将需要打印的结果即该节点,存放到res列表中即可

代码实现

提供了常规数据的树的建立函数

package 剑指offer.搜索与回溯.offer32A;

import java.util.*;

public class Solution {

     TreeNode tree = new TreeNode();


    public static void main(String[] args) {
        Solution solution = new Solution();
        Integer[] test = {1,2,3,4,5,6,7};
        solution.buildTree(test);
        int[] res = solution.levelOrder(solution.tree);

        System.out.println(Arrays.toString(res));

    }


     public  class TreeNode {
        public int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
        TreeNode(){}
     }


    /**
     * 树的建立,存在问题,对于null的节点无法建立,以及对于如果不是完整的二叉树,无法建立,需要优化
     * 适用于:常规数据进行测试
     * @param treeNode
     */
    public void buildTree(Integer[] treeNode){

        Queue<TreeNode> treeNodes = new LinkedList<>();

        int size = treeNode.length;


        int index = 0;
        tree.val = treeNode[index];
        treeNodes.offer(tree);
            while (!treeNodes.isEmpty()){


                int val = treeNode[index];

                if(++index >=size){
                    break;
                }
                int leftVal = treeNode[index];

                if(++index >=size){
                    break;
                }

                int rightVal = treeNode[index];

                TreeNode peek = treeNodes.peek();
                peek.left = new TreeNode(leftVal);
                peek.right = new TreeNode(rightVal);
                treeNodes.offer(peek.left);
                treeNodes.offer(peek.right);

                treeNodes.poll();
            }


    }


    /**
     * 思路分析:
     * 第一步:建立一个二叉树,直接就是传入一个树
     * 第二步:采用层序遍历的方式打印
     * 层序遍历,采用队列先进先出,对于每一个值进行输出
     *
     * @param root
     * @return
     */
    public int[] levelOrder(TreeNode root) {
        //增加一个对于0的判断
        if(root== null){
            return new int[0];
        }

        int n = 1000;
        List<Integer> res = new ArrayList();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()){
            TreeNode peek = queue.peek();
            TreeNode left = peek.left;
            TreeNode right = peek.right;

            int val = peek.val;

            if(!(left ==null)){
               queue.offer(left);
            }

            if(!(right ==null)){
                queue.offer(right);
            }

            queue.poll();
            res.add(val);
        }


        int size = res.size();

        int[] returnRes = new int[size];
        for (int i = 0; i < size; i++) {
            returnRes[i] = res.get(i);
        }

        return returnRes;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值