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

news2024/12/23 9:33:45

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

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

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.coloradmin.cn/o/989878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android:基于mvvm框架使用viewPage

一、前言: 最近在学习viewpage的使用,加上一直以来用mvvm框架。就想着记录一下。 二、代码展示: 1.引入依赖 //viewPage2引用(微信左右滑动页面)implementation androidx.viewpager2:viewpager2:1.0.0 2.在xml中的使用 3.在代码中找到vie…

基于大规模MIMO通信系统的半盲信道估计算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %EM算法收敛所需的迭代 nIter 1; Yp Y(:,1:L_polit,:); %与导频序列相对应的部分 q…

包管理工具--》发布一个自己的npm包

包管理工具系列文章目录 一、包管理工具--》npm的配置及使用(一) 二、包管理工具--》npm的配置及使用(二) 三、包管理工具--》发布一个自己的npm包 四、包管理工具--》yarn的配置及使用 五、包管理工具--》其他包管理器之cnpm…

安达发|APS高级排产软件的三大维度全解

APS软件,全称Advanced Planning and Scheduling,即先进计划与排程系统。它是一种基于计算机技术的集成管理软件,主要用于制造业企业的生产计划、物料需求计划、生产调度、工单管理等方面。APS软件的出现,为企业提供了一种高效、准确、实时的生…

C++——类与对象(下篇)

前言 前面已经介绍了类与对象(上),类与对象(中)的两篇文章,下面是类与对象的最后一些重要知识点的介绍和总结。 目录 再谈构造函数Static成员友元内部类匿名对象拷贝对象时的一些编译器优化再次理解封装…

Linux基于多线程和任务队列实现生产消费模型

目录 一、生产者消费者模型 二、代码实现模型 2.1 BlockQueue.hpp 2.2 MainCP.cc 2.3 执行结果 三、效率优势 一、生产者消费者模型 将上述图片逻辑转换成代码逻辑就是,一批线程充当生产者角色,一批线程充当消费者角色,仓库是生产者和消…

SpotBugs(是FindBugs的继任者)安装、使用

SpotBugs介绍 SpotBugs和FindBugs的关系 SpotBugs是FindBugs的继任者,从SpotBugs停止的地方继续。 备注:FindBugs项目已经停止了,从2015年发布3.0.1版本以后再没有新的版本。 SpotBugs通过静态分析寻找java代码中的bug,通过发现…

vs2019 c++开发linux应用

VS2019 C的跨平台开发——Linux开发_Mr_L_Y的博客-CSDN博客前言由于前段时间正好买了一个服务器来跑Tensorflow的推理模型,所以借这个机会把Linux的开发也一并补上。先声明我的服务器是Ubuntu16.04,下面文章的内容也是基于Ubuntu16.04的。为什么标题要写…

RDG相关记录

最小模块: 加一个空pass GraphBuilder.AddPass(RDG_EVENT_NAME("TEST"),PassParameters,ERDGPassFlags::Raster,[](FRHICommandList& RHICmdList){}); 注意: PassParameters如果定义错误,不会报错,当时增加pass会…

ABY2.0:更低的通信开销

参考文献: [ABY] Demmler D, Schneider T, Zohner M. ABY-A framework for efficient mixed-protocol secure two-party computation[C]//NDSS. 2015.[ABY3] Mohassel P, Rindal P. ABY3: A mixed protocol framework for machine learning[C]//Proceedings of the…

功能定义-紧急制动系统

功能简介 紧急制动系统的触发过程如上图所示: 安全距离报警:当两车距离较近时,会给予驾驶员相应提示 预报警:当两车存在碰撞风险但风险较低【Danger Level1】时,会给予驾驶员提示【提示相比之前更为明显】 制动预填充&…

【JAVA - List】差集removeAll() 四种方法实现与优化

一、场景: 二、结论: 1. 四种方法耗时 三、代码: 一、场景: 求差集 List1 - Lsit2 二、结论: 1. 四种方法耗时 初始条件方法名方法思路耗时 List1.size319418 List2.size284900 List..removeAll(Lsit2)1036987ms…

Spring初始化项目

1、官网用法 访问地址:https://start.spring.io idea配置:https://start.spring.io 2、阿里巴巴加速 访问地址:https://start.aliyun.com/bootstrap.html idea配置:https://start.aliyun.com 3、区别 官网阿里巴巴版本最新稍…

MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)

老生长谈,MySQL具有开源、支持多语言、性能好、安全性高的特点,广受业界欢迎。 在数据爆炸式增长的年代,掌握一种数据库能够更好的提升自己的业务能力(实施工程师)。 此系列将会记录我学习和进阶SQL路上的知识&#xf…

无需编程经验,也能制作租车预约微信小程序,快速上手

现在,制作租车预约微信小程序不再需要编程经验,只需几个简单的步骤,您就可以拥有自己的租车预约微信小程序。在本文中,我们将介绍如何利用乔拓云网后台来制作租车预约微信小程序,并实现您所需的功能。 首先&#xff0c…

【Spring AOP】什么是 AOP ?

目录 🥗1 AOP 的思想 🍚2 AOP 的组成 🥚2.1 切面 🍙3 AOP 的实现 🍤3.1 添加 Spring AOP 依赖 🥫3.2 定义切面 🍣3.3 定义切点 🍳3.4 实现通知 🍔4 AOP 实现的一个例子 1…

ucosii任务切换及任务同步

任务的切换 一、 运行态:占用CPU 二、 等待:调用Pend或延时函数后,释放CUP使用权。 三、 就绪:Pend条件满足(消息到来、等待超时),延时时间完毕后(由等待进入就绪) 四、 …

好奇!为什么很少看到女项目经理?

最近被刚进公司的新人问到,在项目管理领域,为什么女性项目经理的数量相对较少。一时之间我也有些茫然,下了班总结一下,跟大家探讨探讨。 一、职业选择的局限性 其实大多数时候,出现和性别有关的问题时,都是…

基于SSM的社区管理与服务系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

uniapp打包微信小程序。报错:https://api.weixin.qq.com 不在以下 request 合法域名列表

场景:在进行打包上传测试时,发现登录失效,但在测试中【勾选不效应合法域名】就可以。 出现原因:我在获取到用户code后,直接使用调用官方接口换取openid 解决方案: 可以把code带给后端,让他们返…