C++树(四)二叉树

news2024/11/15 10:13:58

目录

 

二叉树的定义:

二叉树相关术语:

二叉树的概念与性质

二叉树基本性质

二叉树的节点数量

满二叉树概念:

完全二叉树概念:

完全二叉树性质:

二叉树的存储

二叉树的遍历

在此基础上,二叉树的遍历又分为以下三种:

先序遍历

中序遍历

二叉树遍历的总结

二叉树的遍历转化

二叉树的特殊遍历方法

特殊的二叉树

二叉搜索树

平衡二叉树

总结:

一、二叉树的概念与性质

二、二叉树的储存与遍历


二叉树的定义:

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树【节选自百度】

节点

左子树

右子树

0

子树 1

子树 7

1

子树 2

子树 6

2

链表也可以看作是一棵特殊的二叉树,因为链表每个结点只有一个子节点,满足二叉树的定义。二叉树与普通树的差别在于,普通树可以有 2 个以上的子节点,而二叉树的子节点不能超过 2 个。

链表

二叉树

后继节点

1个

不超过 2个

任意个

定义关系

链表属于二叉树

二叉树属于树

二叉树相关术语:

  1. 节点:包含一个数据元素及若干指向子树分支的信息 。
  2. 节点的度:一个节点拥有子树的数目称为节点的度 。
  3. 叶子节点:也称为终端节点,没有子树的节点或者度为零的节点。
  4. 分支节点:也称为非终端节点,度不为零的节点称为非终端节点 。
  5. 树的度:树中所有节点的度的最大值。
  6. 节点的层次:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推,如果某一个节点位于第L层,则其子节点位于第L+1层 。
  7. 树的深度:也称为树的高度,树中所有节点的层次最大值称为树的深度 。
  8. 有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树。
  9. 无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树。
  10. 森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根节点删除,则该树就变成了一片森林,森林中的树由原来根节点的各棵子树构成。

二叉树的概念与性质

二叉树限定了孩子个数最多为2,而正是由于这种限定,使得二叉树拥有许多性质。

二叉树基本性质

性质1:在二叉树的第i层上最多有2i-1个结点(i>=1)。

性质2:深度为k的二叉树至多有2k–1个结点(k>=1)。

性质3:对任意一棵二叉树,如果其叶结点数为n0,度为2的结点数为n2,则一定满足:n0=n2+1。

归纳法证明性质3

假设初始为一个两个节点的二叉树。此时n0=n2+1,此时加点有两种方式:

1.加到叶节点,此时n0,n2不变

2.加到只有一个儿子的节点上,此时n0+1,n2+1。同样满足n0=n2+1

如果我们保证前面若干层都是满节点,那么我们就可以知道前面第i层确定的节点个数,这样的树将拥有更多的性质。

二叉树的节点数量

一棵高度为n的二叉树,最多包括2n−1个节点。树高为n,共有n 层,第一层有1 个根节点,根据二叉树的定义,后面每层节点的数量最多为上一层的2 倍,因此最多有:1+2+4+....+2n−1=2n−1个节点。

那么一棵高度为n的二叉树,最少有 n 个节点,是一个链表。

考虑前若干层是否为满节点,我们有两种特殊的二叉树:满二叉树和完全二叉树

满二叉树概念:

一棵深度为k且有2k–1个结点的二叉树 称为满二叉树。 通常来说我们对满二叉树的结点进行 连续编号,约定从根结点起,自上而 下,从左到右进行编号。

完全二叉树概念:

深度为k,有n个结点的二叉树当且 仅当其每一个结点都与深度为k的满 二叉树中编号从1到n的结点一一对 应时,称为完全二叉树。 特点:k-1层以前是满二叉树,最后 一层节点从左到右连续出现。

完全二叉树性质:

性质1:具有n个结点的完全二叉树的深度为:floor(log2n)+1

性质2:对于一棵n个结点的完全二叉树,对任一个结点(编号为i),有:

1) 节点i的左儿子为:i*2,节点i的右儿子为:i*2+1。

2) 若i*2+1>n,说明节点i无右儿子。若i*2>n,说明节点i无儿子。

3) 对于节点i,若i>1,则节点i的父亲为:i/2。

二叉树的存储

对于一颗普通的树,我们采取vector存放儿子,但是对于二叉树,我们只需要记录左右儿子即可。

有数组存放和结构体存放两种方式。结构体存放会更耗空间,因为结构体内部有不定长度的动态数组。 而存放二叉树,只需要用ls,rs来存放左右儿子即可。 空间占用与普通数组一样。对于复杂题目,信息较多的时候,变量命名更轻松,信息也独立。同时为了更快速调用,可以在结构体内进行define。

struct node{
    int value;
    vector<int> childs; //用来记录所有子节点的编号
}nodes[10000];
int root;
//root为根节点

也可以利用二叉树的特性,用左右子树的方式,来存储二叉树。

用结构体来表示二叉树的节点, 每个节点存储了当前节点的值, 以及左子树和右子树的编号。

struct node{
    int value;
    int left;
    int right;
}nodes[10000];
int root;					//root为根节点

二叉树的遍历

遍历二叉树的方法可以沿用遍历树的方法——递归。

DFS(当前节点u){

    DFS(u.left);

    DFS(u.right);

}

在此基础上,二叉树的遍历又分为以下三种:

先序遍历

遍历顺序规则为:根左右,遍历方法:

(1)访问根节点

(2)采用先序递归遍历左子树

(3)采用先序递归遍历右子树

中序遍历

遍历顺序规则为:左根右,遍历方法:

(1)采用中序遍历左子树

(2)访问根节点

(3)采用中序遍历右子树

二叉树遍历的总结

三种方法遍历过程中经过节点的路线一样,只是访问各个节点的顺序不同。

二叉树的先序、中序、后序遍历我们已经学会了, 那么给定其中任意两种遍历, 我们能否推出唯一的第三种遍历么?

答案:给定先序+中序可以推出后序。后序+中序可以推出先序。但是先序+后序是无法推出中序的。

这里我们只是以:知道先序遍历和中序遍历,推断后序遍历作为例子,其他组合方式原理是一样的。

二叉树有以下几种特性:

特性 A ,对于先序遍历,第一个肯定是根节点

特性 B ,对于后序遍历,最后一个肯定是根节点

特性 C ,利用先序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左子树和右子树;

特性 D ,对左子树和右子树分别做前面 3 点的分析和拆分,相当于做递归,我们就可以重建出完整的二叉树。

所以我们可以靠保存先序+中序,或者后序+中序 2 个顺序,来保存整个二叉树的结构。

二叉树的遍历转化

一颗二叉树如果知道中序遍历,以及先序(或后序),我们就能清晰的知道树的结构

二叉树的特殊遍历方法

对于一棵二叉树,由于其特殊的性质,我们在树上信息统计的时候有其独特的方法。

二叉树的特殊遍历方法 前面所学并查集中提到,若没有查询某个节点,节点上的信息可以暂时不更新,等到需要的时候我们再去更新。在二叉树中,应用得也比较广泛,我们称之为”懒标记“。

如图:若某点值若只与父亲节点相关,修改7号节点的时候,只影响其本身的值,其他节点可以正常访问。当我们需要访问到该节点的时候,再进行更新。这样,我们可以将多次修改放到一起解决,从而降低问题的复杂度。

特殊的二叉树

二叉搜索树

        二叉搜索树( Binary Search Tree )它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 它的左、右子树也分别为二叉搜索树。

        能够快速查找数据也是二叉搜索树被用于各类数据结构的原因,但这种快速是有限制的,即不会出现退化,假如二叉搜索树退化为链表,则无法做到快速查找数据的要求,所以又出现了平衡二叉树

平衡二叉树

平衡二叉树( Balanced Binary Tree )具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

平衡二叉树有效的限制了树高,使得二叉树不会退化为一个链表。

平衡二叉树如果同时也是一棵二叉搜索树,那么查找某个节点的效率是O(log(n))的。

很多数据结构,不能完美的做到平衡,但也能有效的控制树高,例如:红黑树。也被经常用于数据的快速查找。

满二叉数有2k-1个结点

样例代码

struct node{
	char value;
		int left,right;
	}data[101];
	int root=0,cnt;
	char ch;
	int buildTree(int bt){
		cin>>ch;
		if(ch=='.'){
			bt==0;
			return bt;
		}else{
			bt=++cnt;
			data[bt].value=ch;
			data[bt].left=data[bt].right=0;
			data[bt].left=buildTree(bt);
			data[bt].right=buildTree(bt);
		}
		return bt;
	} 
	void postorder(int bt){
		if(bt){
			postorder(data[bt].left);
			postorder(data[bt].right);	
			cout<<data[bt].value;
		}
	}
	int main(){
		root=0;
		cnt=0;
		root=buildTree(0);
		postorder(root);
return 0;
}

总结:

一、二叉树的概念与性质

二叉树最多有两个儿子

二叉树的三个基本性质

完全二叉树与满二叉树的基本概念与性质

二、二叉树的储存与遍历

二叉树的独特存储与遍历方法

二叉树的前中后序遍历

二叉树遍历转化

二叉树中懒标记的应用

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

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

相关文章

mac下010editor的配置文件路径

1.打开访达&#xff0c;点击前往&#xff0c;输入~/.config 2.打开这个文件夹 把里面的 010 Editor.ini 文件删除即可&#xff0c;重新安装010 Editor即可

有没有下面符合以下条件的电子时钟的代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【React1】React概述、基本使用、脚手架、JSX、组件

文章目录 1. React基础1.1 React 概述1.1.1 什么是React1.1.2 React 的特点声明式基于组件学习一次,随处使用1.2 React 的基本使用1.2.1 React的安装1.2.2 React的使用1.2.3 React常用方法说明React.createElement()ReactDOM.render()1.3 React 脚手架的使用1.3.1 React 脚手架…

PostgreSQL使用(四)——数据查询

说明&#xff1a;对于一门SQL语言&#xff0c;数据查询是我们非常常用的&#xff0c;也是SQL语言中非常大的一块。本文介绍PostgreSQL使用中的数据查询&#xff0c;如有一张表&#xff0c;内容如下&#xff1a; 简单查询 --- 1.查询某张表的全部数据 select * from tb_student…

MSPM0G3507基于keil无法烧录的解决方法

在学习M0的板卡过程中&#xff0c;遇到了诸多玄学问题。网上的教学大多基于CCS开发&#xff0c;对keil的教学几乎没有。 一开始我以为这个问题是没添加这个&#xff0c;但其实并非如此 在群里的网友说的清除flash&#xff0c;插拔USB,这些都不管用,后面也发现先在CCS烧录一遍&…

前端开发知识(二)-css

<head> <style> div{ } </style> </head> div是布局标签&#xff0c; 一般放在head标签内&#xff0c;最下部。 若直接在在.css文件中写css,文件中&#xff0c;直接写就行&#xff0c;如下所示。 div{ }

VLLM代码解读 | VLLM Hack 3

在上一期&#xff0c;我们看到了多个输入如何被封装&#xff0c;然后被塞入llm_engine中&#xff0c;接下来&#xff0c;通过_run_engine,我们要进行输入的处理了。 def _run_engine(self, *, use_tqdm: bool) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# Ini…

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…

【LeetCode】201. 数字范围按位与

1. 题目 2. 分析 这题挺难想的&#xff0c;我到现在还没想明白&#xff0c;为啥只用左区间和右区间就能找到目标值了&#xff0c;而不用挨个做与操作&#xff1f; 3. 代码 class Solution:def rangeBitwiseAnd(self, left: int, right: int) -> int:left_bin bin(left).…

五. TensorRT API的基本使用-TensorRT-network-structure

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第五章—TensorRT API 的基本使用&#x…

java面向对象进阶进阶篇--《接口和接口与抽象类综合案例》(附带全套源代码)

个人主页→VON 收录专栏→java从入门到起飞 抽象类→抽象类和抽象方法 目录 一、初识接口 特点和用途 示例&#xff1a; Animal类 Dog类 Frog类 Rabbit类 Swim接口 text测试类 结果展示&#xff1a; 二、接口的细节 接口中的成员特点&#xff1a; 成员特点与接口的关…

【通信模块】WiFi&Bluetooth简介与对比

学习云里物里科技文章及结合CSDN优秀作者Edison Tao总结笔记&#xff0c;侵权联删&#xff01; 云里物里科技&#xff1a; https://www.minewtech.com/news/industry-2019-01-25-01.html CSDN&#xff1a; https://blog.csdn.net/taotongning/article/details/95215927 WIFI…

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述&#xff1a;如有下面表格&#xff0c;需要按笔试成绩整体排名。 解决步骤&#xff1a; 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列&#xff08;CtrlShift向下箭头、再按F4&#xff09;。 "确定"即可计算…

C++ | Leetcode C++题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; template <class T> class PeekingIterator : public Iterator<T> { public:PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {flag Iterator<T>::hasNext();if (flag) {nextElement Ite…

AUTOSAR从入门到精通-CAN-FD

目录 几个高频面试题目 CAN与CAN FD的区别是什么? 一、CAN与CAN FD的概念 二、CAN与CANFD的比较 三、CAN与CANFD的优劣势 为何CANFD还不能大面积取代CAN总线? 算法原理 什么是CAN FD CAN FD的特点 为什么会出现CAN FD? CAN FD和CAN总线协议帧异同 Can FD报文讲解…

调用python-docx 提示出错

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【Django】 读取excel文件并在前端以网页形式显示-安装使用Pandas

文章目录 安装pandas写views写urls安装openpyxl重新调试 安装pandas Pandas是一个基于NumPy的Python数据分析库&#xff0c;可以从各种文件格式如CSV、JSON、SQL、Excel等导入数据&#xff0c;并支持多种数据运算操作&#xff0c;如归并、再成形、选择等。 更换pip源 pip co…

C#开发的全屏图片切换效果应用 - 开源研究系列文章 - 个人小作品

这天无聊&#xff0c;想到上次开发的图片显示软件《 PhotoNet看图软件 》&#xff0c;然后想到开发一个全屏图片切换效果的应用&#xff0c;类似于屏幕保护程序&#xff0c;于是就写了此博文。这个应用比较简单&#xff0c;主要是全屏切换换图片效果的问题。 1、 项目目录&…

Boost搜索引擎项目相关介绍

Boost搜索引擎相关介绍&#xff1a; 首先&#xff0c;Boost库不具备搜索条件&#xff0c;所以我们这个项目借此实现搜索功能。 项目的核心就是以用户搜索的相关内容在目标数据中进行查找。 首先&#xff0c;我们面临的第一大难题就是目标数据&#xff0c;在这里目标数据就是Boo…

气膜羽毛球馆的维护和运营成本解析—轻空间

随着人们对健康生活方式的追求不断增加&#xff0c;羽毛球这项运动也愈发受到欢迎。然而&#xff0c;传统的羽毛球馆往往存在建设周期长、成本高、维护复杂等问题。气膜羽毛球馆作为一种新型的运动场馆解决方案&#xff0c;因其快速搭建、环保节能、舒适环境等优势而逐渐被广泛…