自己动手作图深入理解二叉树、满二叉树及完全二叉树
时间:2022-07-23
本文章向大家介绍自己动手作图深入理解二叉树、满二叉树及完全二叉树,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、背景
二叉树是数据结构中的重点,也是难点。二叉树是一种非线性结构,比数组、栈、队列等线性结构相比复杂度更高,想要做到心中有“树”,需要自己动手画图、观察、思考,才能领会其真谛。该文将会结合图形,深入理解二叉树、满二叉树及完全二叉树的概念。
二、基本概念
2.1 结点
- 结点是组成二叉树的最小单元。 -- 用图形表示
-- 用代码表示
// 结点
class Node<E> {
E e;
Node left, right;
Node(E e) {
this.e= e;
this.left = null;
this.right = null;
}
}
2.2 二叉树
- 每个结点的度(结点拥有的子树数目)不超过2的树叫做二叉树
2.2.1 二叉树的深度
- 结点的最大层次数称为树的深度或高度
2.3 满二叉树
- 指深度为k且有2k-1个结点的二叉树,即所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
- 下图中深度为4,24-1=15个结点,且所有叶子都在第四层上。
2.4 完全二叉树
- 一颗深度为k的二叉树,k层的结点都是连续靠左并不可隔开的,并且1~k-1层的结点也组成了一棵满二叉树,这样的二叉树,我们称为完全二叉树。
2.4.1 完全二叉树的线性存储
- 出于简便起见,完全二叉树通常采用数组进行线性存储
/**
* 完全二叉树的线性存储
*
* @author zhuhuix
* @date 2020-06-24
*/
public class FullBinaryTree {
private Object[] arr;
private int size;
FullBinaryTree(int capacity) {
this.arr = new Object[capacity + 1];
this.size = 0;
}
public int getSize() {
return this.size;
}
public boolean isEmpty() {
return this.size == 0;
}
public void add(Object e, int index) {
assert index <= this.arr.length;
this.arr[index] = e;
this.size++;
}
@Override
public String toString() {
return "FullBinaryTree{" +
"arr=" + Arrays.toString(arr) +
", size=" + size +
'}';
}
public static void main(String[] args) {
FullBinaryTree fullBinaryTree = new FullBinaryTree(26);
// 从下标1开始存入26个字母
for (Character c = 'A'; c <= 'Z'; c++) {
fullBinaryTree.add(c, c - 'A' + 1);
}
System.out.println( fullBinaryTree.toString());
}
}
2.4.2 完全二叉树的创建与遍历
/**
* 完全二叉树的创建与遍历
*
* @author zhuhuix
* @date 2020-06-24
*/
public class BinaryTree {
// 结点
private Node root;
// 结点数
private int size;
// 存放结点
private ArrayList<Node> list;
public BinaryTree() {
this.root = null;
this.size = 0;
this.list = new ArrayList<>();
}
public void createTree(Object[] array){
for(int i=0;i<array.length;i++){
Node node =new Node(array[i]);
list.add(node);
if (this.root==null){
this.root = node;
}
}
if(list.size()>0){
for(int i=0;i<array.length/2;i++){
if(2*i+1<list.size()) {
list.get(i).left=list.get(2 * i + 1);
}
if(2*i+2<list.size()) {
list.get(i).right=list.get(2 * i + 2);
}
}
}
}
// 前序遍历
public void preOrder(Node root){
if(root == null){
return ;
}
else{
System.out.println(root.getData());
}
preOrder(root.left);
preOrder(root.right);
}
public Node getRoot() {
return root;
}
// 私有内部类-树结点
private class Node {
Object data;
Node left, right;
Node(Object data) {
this.data = data;
this.left = null;
this.right = null;
}
Object getData() {
return data;
}
}
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
Character[] array ={'A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
binaryTree.createTree(array);
binaryTree.preOrder(binaryTree.getRoot());
}
}
- 大整数乘法
- ntp服务配置
- Linux系统下如何查看及修改文件读写权限
- Apache Commons CLI命令行启动
- rsync+inotify实时同步
- 18本纸质书:OpenCV、Python和机器学习,总有一本适合你
- 三种Linux服务器监控技术的对比
- http和www服务基础知识
- 手把手教你在VirtualBox中与主机共享文件夹
- Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署
- Kafka入门初探+伪集群部署
- Beats数据采集---PacketbeatFilebeatTopbeatWinlogBeat使用指南
- linux NFS网络文件系统
- linux基础命令
- 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 数组属性和方法
- 不借助Maven,使用Eclipse创建Hello World级别的Spring项目
- Spring Bean的生命周期
- Spring Bean 后置处理器PostProcessor
- 潘石屹用Python解决100个问题 | 排列组合
- 潘石屹用Python解决100个问题 | 企业根据利润提成发奖金
- 【STM32F407开发板用户手册】第27章
- Spring Bean的继承
- 移动端点击事件延迟的诞生消亡史
- 谈谈电商系统中的商品模块设计
- [数据结构与算法] 排序算法之冒泡排序与快速排序(快排)
- [数据结构与算法] 邂逅栈
- Hive建表异常
- Spring全家桶之SpringData——Spring 整合Hibernate与Hibernate Jpa
- MyCat练手项目以及简单分页功能实现
- Redis在分布式项目中的应用