数据结构 第六章 二叉树与树(树和森林)

news2024/11/15 12:05:05

1 双亲表示法(方便查找双亲)

使用层次遍历的方法将一个树中的所有结点存储到一维数组中
请添加图片描述请添加图片描述

2 孩子表示法(方便查找孩子)

顺序+链式存储结构:
1 使用数组来存储所有结点
2 为每一个结点来设置一个单链表
3 单链表链接的是其所有孩子结点的下标

请添加图片描述
请添加图片描述

3 双亲孩子结合表示法

在孩子表示法的数组中增加一个parent区域
请添加图片描述

4 孩子兄弟表示法(左孩子右兄弟表示法)

**使用二叉链表作为树的存储结构**
firstChild指向结点最左侧的第一个孩子
nextSibling指向结点右侧的紧挨着的第一个兄弟

请添加图片描述
请添加图片描述

5 树到二叉树的转换

5.1 将树转化为二叉树

(将树转化为二叉树其右子树一定为空)

5.1.1连线

在所有的兄弟结点之间加上一条连线
请添加图片描述

5.1.2删线

对于每个结点,除了保留与其最左孩子的连线外,删掉该结点与其它孩子之间的连线

请添加图片描述

5.1.3旋转

将按照以上方法形成的二叉树,沿着顺时针方向旋转45°
就可以得到一颗二叉树

请添加图片描述

6 森林到二叉树的转换

6.1 将森林转化为二叉树

6.1.1连线

在所有的兄弟结点之间加上一条连线
(包括森林中所有树的根节点)
请添加图片描述

6.1.2删线

对于每个结点,除了保留与其最左孩子的连线外,删掉该结点与其它孩子之间的连线
请添加图片描述

6.1.3旋转

将按照以上方法形成的二叉树,沿着顺时针方向旋转45°
就可以得到一颗二叉树
请添加图片描述
请添加图片描述

7 二叉树到森林或树的转换

是森林或树到二叉树的转换的逆过程请添加图片描述

注意:
1 连线:如果某结点的左孩子有右子树,将该结点**与其左孩子的右子树的右链上各个结点都增加连线**
2 删线:删除二叉树中所有双亲结点与其右孩子结点的连线

请添加图片描述

请添加图片描述

8 树和森林的遍历

8.1 树和森林的深度优先遍历

请添加图片描述
请添加图片描述

注意:
1 树的前序遍历和对应二叉树的前序遍历一样
2 树的中序(后序)遍历和对应二叉树的中序遍历一样

8.1.1 前序遍历

//实现树和森林的前序遍历
void func_qxbl(Node* t){
	while(t!=NULL)
	{
		printf("%d\n",t->data);//访问当前结点数据
		func_qxbl(t->firstChild);//前序遍历t的各个子树
		t = t->nextSibling;//遍历其他的树
	}
}

8.1.2 中序(也叫后序)遍历

//实现树和森林的中序(后续)遍历
void func_zhxbl(Node* t){
	while(t!=NULL)
	{
		func_zhxbl(t->firstChild);//遍历t的各个子树
		printf("%d\n",t->data);//访问当前结点数据
		t = t->nextSibling;//遍历其他的树
	}
}

8.1.3 总结

因为:
1 树的前序遍历和对应二叉树的前序遍历一样
2 树的中序(后序)遍历和对应二叉树的中序遍历一样
3 那么树的前序遍历代码可以写成对应二叉树的前序遍历代码
4 树的中序(后序)遍历代码可以写成对应二叉树的中序遍历代码

利用二叉树的前序遍历实现树、森林的前序遍历

void func_qxbl(Node* t){
	if(t!=NULL)
	{
		printf("%d\n",t->data);//访问当前结点数据
		func_qxbl(t->firstChild);//前序遍历第一棵子树
		func_qxbl(t->nextSibling);//前序遍历其他子树		
	}
}

利用二叉树的中序遍历实现树、森林的中序(后序)遍历

void func_zhxbl(Node* t){
	if(t!=NULL)
	{
		func_zhxbl(t->firstChild);//遍历第一棵子树
		printf("%d\n",t->data);//访问当前结点数据
		func_zhxbl(t->nextSibling);//遍历其他子树		
	}
}

8.2 树和森林的广度优先遍历

8.2.1 层次遍历(从上到下、从左到右)请添加图片描述

9 求树的高度

注意:
1 树和森林采用左孩子右兄弟表示法(二叉树)

使用递归前序遍历树请添加图片描述

int height(){
	if(t == NULL)
		return 0;
	else{
		int lh = height(t->firstChild);
		int rh = height(t->nextSibling);
		return 1+lh>rh?lh+1:rh;	
		// 1+lh是t这棵树的高度
		// rh是兄弟森林的高度
	}
}

10 求树的结点总数

使用递归前序遍历树
请添加图片描述

int size(Node* t){
	if(t == NULL)
		return 0;
	else
		return 1+size(t->firstChild)+size(t->nextSibling);
}

11 求树的叶子结点总数

使用递归前序遍历树请添加图片描述

请添加图片描述

int leaf(Node* t)
{
	if(t == NULL)
		return 0;
	else{
		if(t->firstChild == NULL)//当前结点是叶子结点
			return 1+leaf(t->nextSibling);
		else
			return leaf(t->firstChild)+leaf(t->nextSibling);	
	}
}

12 典型题目解析

请添加图片描述

解析:
1 根据二叉树画出森林
2 判断对应关系

请添加图片描述

结论:
1 u和v可能具有的关系是:父子关系、兄弟关系

请添加图片描述

解析:
1 根据二叉树的性质:n0 = n2+1 可得
2 对于度为4的树而言:n0 = 3*n4+2*n3+1*n2+1
3 n0 = 60+20+1+1 = 82个

请添加图片描述


请添加图片描述


请添加图片描述

解析:
1 树和森林使用的是孩子兄弟表示法
2 如果左孩子指针为空,就不会有其他孩子了
3 其就是叶子结点
4 所以说**森林中叶子结点的个数**对应**二叉树中左孩子指针为空的结点个数**

请添加图片描述

解析:
1 15条边对应16个结点
2 剩余的9个结点构成9个树
3 1+9 = 10

请添加图片描述


请添加图片描述


请添加图片描述


请添加图片描述


请添加图片描述


请添加图片描述

13 易错题

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

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

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

相关文章

扬兴 | 选型技巧!晶振在商业显示屏的应用

据有关机构预计,未来五年,商显市场将以每年13-16%的增速发展,预计到2024年将达到1545亿元的规模。伴随着商显屏行业的飞速发展,必然带动电子元器件行业的增长,这也对元器件产品要求不断提高,其中晶振作为数…

【字符串】剑指Offer 05.替换空格(C/C++/Java/Python/Js)

剑指Offer 05.替换空格1 题目2 思路--双指针法3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python3版本3.5 JavaScript版本4 总结1 题目 题源链接 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s “We are…

重磅!马斯克再抛特斯拉股票,去年中国市场份额首次下滑

特斯拉的走势,正在凸显智能电动汽车市场格局的新变化。 几周前,特斯拉首席执行官埃隆马斯克出售了价值近36亿美元的股票,就在三周前,这家全球智能电动汽车领头羊宣布未能实现年度交付目标(少了近2.2万辆)。…

windows下同时安装mysql5.5和mysql8.0.32

一、安装mysql8.0.32 我先安装的是mysql5.5,如:MySQL5.5安装教程SQLyog安装_柒七的博客-CSDN博客_mysql5.5的安装步骤 1.下载解压 https://dev.mysql.com/downloads/mysql/ 2.创建配置 下载完后,建议解压到一个没有中文的路径&#xff0…

Vue使用ElementUI动态修改table单元格背景颜色或文本颜色

前言 今天遇到一个场景,表格行属性的字典项要针对不同的状态,展示不同的文本颜色,如下图所示: 账号状态这一栏,如果是正常就展示以绿色字体展示,如果是禁用就以红色颜色展示 针对这个需求,我第…

u盘文件被电脑杀毒软件删掉了,怎么才能恢复

案例分享:【我的u盘中毒文件被电脑杀毒软件删掉了,怎么才能恢复啊??里面有很重要的资料。求高手指点!急!!!】——虽然u盘能够存储数据,且体积小巧便于携带,但…

算法:(十二)排序

文章目录12.1 计数排序面试题75:数组相对排序12.2 快速排序面试题76:数组中第k大的数12.3 归并排序面试题77:链表排序面试题78:合并排序链表12.1 计数排序 面试题75:数组相对排序 题目: 给定两个数组&…

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); var user requi…

龙芯处理器7A2000桥片iTOP-3A5000开发板

龙芯处理器7A2000桥片iTOP-3A5000开发板 主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错(配置可选) 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm C…

力扣二叉树篇题

题目说明B树如果为空树则不是A树的子结构 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {public boolean isSubStructure(TreeNode A,…

VMware ESXi 7.0 Update 3j 更新发布,修复已知问题

VMware ESXi 7.0 Update 3j Standard & All Custom Image for ESXi 7.0 U3j Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 产品简介…

迁移mysql数据库到opengauss

一、安装chameleon工具1.下载源码git clone gitgitee.com:opengauss/openGauss-tools-chameleon.git2.创建Python虚拟环境并激活安装依赖:yum install mysql-devel gcc gcc-devel python-develpython3 -m venv venvsource venv/bin/activate3.进入代码的目录&#x…

CAD转PDF其实很简单,掌握这4种方法就可以

Hello,大家好,这里是建模助手! CAD作为一种绘图格式,在工业设计领域发挥着不可替代的作用,一般有DXF、DWG两种常见的格式,但是一般需要在电脑中安装特定软件才能打开此类格式的文件。 因此大多数人在给别…

网站表单实时通知 销售线索不错漏

对于企业来说,在进行产品发布或营销推广时,都需要大量的信息收集汇总。此时都会用到表单功能,网站上的表单功能应用非常广泛,可做信息收集效果,可做付费预约效果等,而如果希望能实时推送表单收集到的数据&a…

AQS(AbstractQueuedSynchronizer)是什么?

目录简介原理概览资源的共享方式独占(Exclusive)共享(Shared)模板方法模式在AQS中的应用经典应用ReentrantLockSemaphore简介 AQS全称AbstractQueuedSynchronizer,位于java.util.concurrent.locks包下,它是…

Kubernetes (k8s)在企业项目中的重点应用场景以及云原生和云架构的原理

Kubernetes (k8s)在企业项目中的重点应用场景以及云原生和云架构的原理。 Kubernetes,简称 K8s,是用 8 代替中间 8 个字符 “ubernete” 而成的缩写,是一个开源的,用于管理云平台中多个主机上的容器化的应…

Allegro因为DRC报错无法使用走线居中命令的解决办法

Allegro因为DRC报错无法使用走线居中命令的解决办法 在用Allegro做PCB设计的时候,走线居中是非常实用的功能 但是这个功能只能在走线居中不会产生DRC的使用。 如果居中后仍然存在DRC,比如间距,等长等等DRC,如下图: 使用居中命令就会出现报错,如图,因为居中后线距离孔的…

图文详解Linux中的火墙策略优化

目录 前言 一、火墙管理工具切换 二、iptables 的使用 三、火墙默认策略 四、firewalld的使用 1、firewalld的开启 2、关于firewalld的域 3、关于firewalld的设定原理及数据存储 4、firewalld的管理命令 5、firewalld的高级规则 6、firewalld中的NAT 总结 前言 火…

【软件测试】性能测试面试题分析与回答,你的优势不止这些......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 软件测试这一岗已悄…

Java原型模式以及引用拷贝与对象拷贝问题

目录基本数据类型,引用数据类型,String引用拷贝对象拷贝浅拷贝深拷贝原型模式基本数据类型,引用数据类型,String 这里为了更好的理解栈,堆的指向关系,Java传值,传引用问题,我找来一…