数据结构与算法-树论基础二叉树

大家来看以下几个结构:下图中的结构除了一颗不是树其余的都是,我们可以发现这个跟我们现实生活的树是不是非常相似.

在树形结构里面有几个重要的术语:

1.结点:树里面的元素。

2.父子关系:结点之间相连的边

3.子树:当结点大于1时,其余的结点分为的互不相交的集合称为子树

4.度:一个结点拥有的子树数量称为结点的度

5.叶子:度为0的结点

6.孩子:结点的子树的根称为孩子结点

7.双亲:和孩子结点对应

8.兄弟:同一个双亲结点

9.森林:由N个互不相交的树构成深林

在树形结构里面有几个重要的术语:

结点的高度:结点到叶子结点的最长路径

结点的深度:根结点到该结点的边个数

结点的层数:结点的深度加1

树的高度:根结点的高度

常见的二叉树:平衡二叉树 二叉查找树 红黑树 完全二叉树:(堆排序;大顶堆,小顶堆) 满二叉树

常见的N叉树:B树(B-Tree,B+Tree)

在树形结构中最重要的就是二叉树,很多经典的算法与数据结构其实都是通过二叉树发展而来。        

        Binary Tree:一种特殊的树形结构,每个节点至多只有两颗子树。

        在二叉树的第N层上至多有2^(N-1)个结点。最多有2^N-1个结点个数。

        满二叉树:除叶子结点外,每个结点都有左右两个子结点。

        完全二叉树:除最后一层外,其他的结点个数必须达到最大,并且最后一层结点都连续靠左排列。

思考?为什么要分满二叉树和完全二叉树呢?因为通过定义可以看出,完全二叉树只是满二叉树里面的一个子集

要想清楚上面那个问题我们要从树形结构的存储开始:

        基于数组存储:利用数组下标。假设A为i,则B=2*i,C=2*i+1,依次类推 但是假如是下面第二图这种情况,用数组存储会发生什么情况?

        答:你会发现如果用数组来存储的话会浪费很多空间,那怎么办呢?大家最先想到的肯定是链表,对的, 是要借用链表来实现,但是数组的性能是高效的,也不需要开额外的指针,所以如果是一课完全 二叉树的话我们就可以用数组来实现因为可以使用数组下标和结点对应,如上图。如果不是完全二叉树的话如果缺失左叶子,只有右叶子的话数组存储会浪费空间。这也是为什么还要分一个完全二叉树出来的根本原因。 后面的堆还会在来看这个结构。

四种遍历方式: 

        重要口诀:根节点输出!子树

        前序:根 左 右

        中序:左 根 右 BDCAEHGKF

        后序:左 右 根  DCBHKGFEA

注意:每次遍历从根结点开始算,然后将根下方的看成一个子树,然后按照口诀根输出遍历,遇到根输出就行!

代码实现树

package tree;class MyTreeNode{private char data;private MyTreeNode left;private MyTreeNode right;public MyTreeNode(char data, MyTreeNode left, MyTreeNode right) {super();this.setData(data);this.setLeft(left);this.setRight(right);}public char getData() {return data;}public void setData(char data) {this.data = data;}public MyTreeNode getLeft() {return left;}public void setLeft(MyTreeNode left) {this.left = left;}public MyTreeNode getRight() {return right;}public void setRight(MyTreeNode right) {this.right = right;}}public class BinaryTree {public static void main(String[] args) {MyTreeNode D = new MyTreeNode('D', null, null);MyTreeNode H = new MyTreeNode('H', null, null);MyTreeNode K = new MyTreeNode('K', null, null);MyTreeNode C = new MyTreeNode('C', D, null);MyTreeNode G = new MyTreeNode('G', H, K);MyTreeNode B = new MyTreeNode('B', null, C);MyTreeNode F = new MyTreeNode('F', G, null);MyTreeNode E = new MyTreeNode('E', null, F);MyTreeNode A = new MyTreeNode('A', B, E);BinaryTree binaryTree = new BinaryTree();System.out.println("前");binaryTree.pre(A);System.out.println();System.out.println("中");binaryTree.in(A);System.out.println();System.out.println("后");binaryTree.post(A);}public void print(MyTreeNode node){System.out.print(node.getData());}public void pre(MyTreeNode root){		//前序遍历 根(输出) 左 右 时间复杂度?O(n) N^2 O(2*n)=>O(n);print(root);if(root.getLeft() != null){pre(root.getLeft());	//认为是子树,分解子问题;}if(root.getRight() != null){pre(root.getRight());}}public void in(MyTreeNode root){		//中序遍历  左 根(输出)  右if(root.getLeft() != null){in(root.getLeft());	//认为是子树,分解子问题;}print(root);if(root.getRight() != null){in(root.getRight());}}public void post(MyTreeNode root){		//后序遍历  左  右 根(输出) if(root.getLeft() != null){post(root.getLeft());	//认为是子树,分解子问题;}if(root.getRight() != null){post(root.getRight());}print(root);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生Kubernetes:Kubeadm部署K8S单Master架构

目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm,kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …

Main()函数的前世今生

在开始分析程序之前,我们第一个要解决的问题,就是如何定位到main函数,想要从二进制逆向的角度分析出main函数,就必须要了解正向的代码下main函数的所有的细节和特 征。毕竟逆向的本质就是正向。 调用main()堆栈 样例代码 #incl…

MySQL下载安装环境变量配置,常用命令

一、下载安装 mysql官网 下载连接 这个是下载图形安装 https://dev.mysql.com/downloads/installer/ 这个是下载免图形安装 https://dev.mysql.com/downloads/mysql/ 担心个别宝宝没有账号,这边也提供一下,方便下载: 账户:1602404…

飞书即时消息无需API开发连接Cohere,打造飞书AI智能问答助手

飞书即时消息用户使用场景: 许多企业都在使用飞书系统进行协同办公,而现在有了Cohere大语言模型技术,能够根据用户的提问来自动产生回答,无需人为干预。对于企业负责人来说,他们认为如果将Cohere技术融入到飞书机器人中…

[C++]杨辉三角

目录 题目 解题思路 代码实现 获取数字 打印函数 主函数 全部代码 运行结果 题目 给定一个非负整数numRows ,生成「杨辉三角」的前numRows行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 解题思路 第k列的第i个数字的值第k-1列的(…

Java项目-苍穹外卖-Day10-SpirngTask及WebSocket

文章目录 前言SpringTask介绍SpringTask_corn表达式Spring_Task入门案例 订单状态定时处理需求分析代码开发功能测试 前言 本章实现的业务功能 超时未支付订单自动取消,配送中订单商家忘点完成自动再固定时间检查且修改成完成状态 来单提醒功能 催单提醒功能 …

SpringMVC之CRUD(直接让你迅速完成部署)

一、项目创建 首先创建一个基于maven的项目部署&#xff0c;如果有些插件没有的话可以参考mybatis入门Idea搭建 二、配置依赖导入 依赖导入 1、pom.xml 需要根据自己的文件来进行导入&#xff0c;并不是原本照着导入 <project xmlns"http://maven.apache.org/POM/4.0.0…

微服务模式:服务发现模式

由于微服务应用的动态性&#xff0c;很难调用具有固定 IP 地址的服务。这就是服务发现的概念出现的背景。服务发现有助于客户端了解服务实例的位置。在这种情况下&#xff0c;服务发现组件将充当服务注册表。 服务注册表是一个包含服务实例位置的集中式服务器/数据库。在微服务…

成都瀚网科技有限公司:抖音怎么绑定抖音小店才好?

抖音是一款非常流行的短视频应用&#xff0c;为用户提供了一个展示才华、分享生活的平台。在抖音上&#xff0c;用户可以通过绑定抖音商店来销售自己的产品或服务&#xff0c;从而实现商业变现。那么&#xff0c;抖音如何绑定抖音商店呢&#xff1f; 1、抖音如何绑定抖音商店&a…

安全模型中的4个P

引言&#xff1a;在安全模型中&#xff0c;经常会碰到PDR,PPDR&#xff0c;IPDRR&#xff0c;CARTA-PPDR等模型&#xff0c;其中的P&#xff0c;是predict&#xff1f;是prevent&#xff1f;还是protect&#xff1f;还是policy呢&#xff1f; 一、4P字典意思解释 1、predict&a…

苹果macOS 13.5.2正式发布 修复ImageIO进程

9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 需要注意的是&#xff0c;因苹果各区域节点服务器配置缓存问题&#xff0c;可能有些地方探测到…

解决本地jar包导入maven

1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径&#xff08;尽量简单并且不要含中文&#xff09; <group-id>为grouId号&#xff0c;与<artifact-id>组成唯一识别你jar包的坐标&#xff0c;当不在公共资源jar包中&#…

四川百幕晟科技:抖音新店怎么快速起店?

抖音作为全球最大的短视频平台&#xff0c;拥有庞大的用户基础和强大的影响力&#xff0c;成为众多商家宣传产品、增加销量的理想选择。那么&#xff0c;如何快速开店并成功运营呢&#xff1f;下面描述了一些关键步骤。 1、如何快速开新店&#xff1f; 1、确定产品定位&#x…

Java 线程池

线程池 什么是线程池&#xff1f; 线程池&#xff1a; 简单理解&#xff0c;它就是一个管理线程的池子。 它帮我们管理线程&#xff0c;避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象&#xff0c;创建一个对象&#xff0c;需要经过类加载过程&#xff0c;…

【计算机网络】 TCP协议头相关知识点

文章目录 TCP协议头 TCP协议头 我们来看一下TCP协议头里都有什么东西&#xff0c;研究一下为什么TCP协议是可靠的呢 TCP协议可靠是因为在协议头里带着一些校验的数据 首先是源端口和目的端口&#xff0c;这两个是UDP中也有的&#xff0c;但是UDP中只有这两个&#xff0c;没有…

【Redis】如何保证Redis缓存与数据库的一致性?

文章目录 1、四种同步策略2、更新缓存还是删除缓存2.1 更新缓存2.2 删除缓存 3、先操作数据库还是缓存3.1 先删除缓存再更新数据库3.2 先更新数据库再删除缓存 4、延时双删4.1 采用读写分离的架构怎么办&#xff1f; 5、利用消息队列进行删除的补偿 1、四种同步策略 想要保证缓…

手写Spring:第7章-实现应用上下文

文章目录 一、目标&#xff1a;实现应用上下文二、设计&#xff1a;实现应用上下文三、实现&#xff1a;实现应用上下文3.1 工程结构3.2 Spring应用上下文和Bean对象扩展类图3.3 对象工厂和对象扩展接口3.3.1 对象工厂扩展接口3.3.2 对象扩展接口 3.4 定义应用上下文3.4.1 定义…

K8S原理架构与实战教程

文章目录 一、背景1.1 物理机时代、虚拟机时代、容器化时代1.2 容器编排的需要 二、K8S架构2.2 Worker节点 三、核心概念3.1 Pod3.2 Deployment3.3 Service3.4 Volume3.5 Namespace 四、K8S安装五、kubectl常用命令六、K8S实战6.1 水平扩容6.2 自动装箱6.2.1 节点污点6.2.2 Pod…

【数据结构初阶】二、 线性表里的顺序表

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客 1 . 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

本文是 3 篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…