剑指offer代码解析——面试题23从上往下打印二叉树
时间:2022-05-03
本文章向大家介绍剑指offer代码解析——面试题23从上往下打印二叉树,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本题的详细分析过程均在代码注释中:
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 题目:从上到下打印二叉树的结点,同一层的结点按照从左到右的顺序打印。
* @author 大闲人柴毛毛
* @date 2016年3月15日
*/
public class PrintBinaryTree {
/**
* 分析:学过数据结构便可知,本题实则为宽度优先遍历二叉树。
* 在数据结构中,深度优先遍历一棵二叉树有三种方式:先序遍历、中序遍历、后序遍历。他们均可采用递归,代码非常简洁。
* 而宽度优先遍历二叉树可采用迭代,并借助一个辅助的队列来存储尚未遍历的结点,下面是详细过程。
*/
/**
* 首先需要创建一个队列,用于存储尚未打印的结点。
* 首先让根结点入队,然后重复一下操作,直到对为空为止:
* 从队首取出一个结点,并打印该结点,若该结点有孩子,则按照先左后右的顺序将左右孩子入队。
* 重复上述操作,当队为空时,遍历结束。
*/
public static boolean printBinaryTree(BinaryTreeNode<Integer> root){
//若树为空
if(root==null){
System.out.println("树为空!");
return false;
}
//创建队列
Queue<BinaryTreeNode<Integer>> queue = new LinkedBlockingQueue<BinaryTreeNode<Integer>>();
//将根结点入队
queue.add(root);
//当队不为空时
while(!queue.isEmpty()){
//取出队首结点
BinaryTreeNode<Integer> first_node = queue.poll();
System.out.println(first_node.data);
//若该结点有孩子,则按照先左后右的顺序将孩子入队
if(first_node.left!=null)
queue.add(first_node.left);
if(first_node.right!=null)
queue.add(first_node.right);
}
return true;
}
/**
* 测试
*/
public static void main(String[] args){
//构建二叉树
BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>();
BinaryTreeNode<Integer> node1 = new BinaryTreeNode<Integer>();
BinaryTreeNode<Integer> node2 = new BinaryTreeNode<Integer>();
BinaryTreeNode<Integer> node3 = new BinaryTreeNode<Integer>();
BinaryTreeNode<Integer> node4 = new BinaryTreeNode<Integer>();
BinaryTreeNode<Integer> node5 = new BinaryTreeNode<Integer>();
root.data = 1;
node1.data = 2;
node2.data = 3;
node3.data = 4;
node4.data = 5;
node5.data = 6;
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.right = node5;
printBinaryTree(root);
}
}
/**
* 二叉树的结点
*/
class BinaryTreeNode<T>{
T data;//结点的数据域
BinaryTreeNode<T> left;//左子树
BinaryTreeNode<T> right;//右子树
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈求子集问题
- 关于背包问题的一点发散
- 没有SortedList,如何快速找到中值
- DFS最难也就这样了
- 浅谈二分查找的变种
- BFS(广度优先算法)也就这么回事
- 从零钱兑换再看动态规划的套路
- Azure认知服务之使用墨迹识别功能识别手写汉字
- 基于 TypeScript 的 Weex 优化实践
- R语言数据库中如何多条件排序
- 用好 Java 中的枚举,真的没有那么简单!
- ABAP整型类型的几种位操作 - OR, AND, XOR的
- 【机器学习】算法原理详细推导与实现(七):决策树算法
- 如何使用代码修改SAP CRM One Order CUMULAT_H对象的值
- Caffeine Cache~高性能 Java 本地缓存之王