32_剑指offer_java_从上到下打印二叉树

本文详细介绍了一种从上到下、从左到右打印二叉树各层节点的算法,利用队列实现广度优先搜索,适用于各种二叉树结构,包括完全二叉树、仅含左子树或右子树的树。文章提供了具体实现代码,并通过功能测试验证了算法的有效性。

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

题目描述

 

从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如下图,则依次打印出1,2,3,4,5,6,7。

 

 

二叉树节点如下:

public class BinaryTreeNode {
    int value;
    BinaryTreeNode left;
    BinaryTreeNode right;
}

测试用例

 

  • 功能测试(完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树)
  • 特殊功能测试(二叉树根节点为空指针;只有一个节点的二叉树)

 

题目考点

 

  • 考察应聘者的思维能力,想到用队列处理按层遍历
  • 考察应聘者对二叉树及队列的理解。

 

解题思路

 

详细见书上表格,使用队列实现树的遍历,打印规律:

1、头节点放入队列;

2、队列不为空,则打印队列的头节点(先入,先出);

3、判断取出的头节点有无子节点。如果有子节点,将其入队列的末尾;如果没有,队列不变;

4、循环,直到队列为空。

 

参考解题

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        // 异常
        ArrayList<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        //定义队列(容器),按照打印顺序存储节点
        Queue<TreeNode> queue = new LinkedList<>();
        // 根节点入队
        queue.offer(root);//offer(E e)如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。
        // 循环直到队列为空
        while(!queue.isEmpty()){
            // 队列不为空,打印队列头节点(放入结果容器)
            TreeNode node = queue.poll();// 检索并删除此队列的头,如果此队列为空,则返回 null 。
            result.add(node.val);
            //判断取出的头节点有无子节点。如果有子节点,将其入队列的末尾;如果没有,队列不变; 
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
        }
        return result;
    }
}

 

补充

 

不管是广度优先遍历一副有向图还是一颗,都要用到队列或者栈。

1、首先,把起始节点(对树而言是根节点)放入队列;

2、接下来,每次从队列中取出一个节点;

3、遍历这个节点能够达到的节点(对树而言是子节点),依次序放入队列;

4、重复这个遍历过程,直到队列中的节点全部被遍历为止。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值