数据结构(陈越,何钦铭)第三讲 树(上)

news2025/3/14 12:28:29

3.1 树与数的表示

3.1.1 顺序查找

在这里插入图片描述

int SequentialSearch(List Tbl,ElementType K){
	int i;
	Tbl->Element[0]=K;
	for(i=Tbl->Length;Tbl->Element[i]!=K;i--);
	return i;
} 

typedef struct LNode *List;
struct LNode{
	ElementType Element[MAXSIZE];
	int Length;
};

3.1.2 二分查找例子

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.1.3 二分查找实现

int BinarySearch(List Tbl,ElementType K){
	int left,right,mid,NoFound=-1;
	left=1;
	right=Tbl->Length;
	while(left<=right){
		mid=(left+right)/2;
		if(K<TBl->Element[mid]){
			right=mid-1;
		}else if(K>Tbl->Element[mid]){
			left=mid+1;
		}else{
			return mid;
		}
		return NotFound;
	}
}

在这里插入图片描述

3.1.4 树的定义和术语

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.5 树的表示

在这里插入图片描述

3.2 二叉树及存储结构

3.2.1 二叉树的定义及性质

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.2 二叉树的存储结构

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3 二叉树的遍历

3.3.1 先序中序后序遍历

在这里插入图片描述

//先序遍历 
void PreOrderTraversal(BinTree BT){
	if(BT){
		printf("%d",BT->Data);
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
	}
}

在这里插入图片描述

//中序遍历 
void InOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		printf("%d",BT->Data);
		PreOrderTraversal(BT->Right);
	}
}

在这里插入图片描述

//后序遍历 
void PostOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
		printf("%d",BT->Data);
	}
}

3.3.2 中序非递归遍历

基本思路:使用堆栈
在这里插入图片描述

//中序遍历非递归
void InOrderTraversal(BinTree BT){
	BinTree T=BT;
	Stack S=CreateStack(MaxSize){
		while(T||!IsEmpty(S)){
			while(T){
				Push(S,T);
				T=T->Left;
			}
			if(!IsEmpty(S)){
				T=Pop(S);
				printf("%5d",T->Data);
				T=T->Right;
			}
		}
	}
} 
//先序遍历非递归
void PreOrderTraversal(BinTree BT){
	BinTree T=BT;
	Stack S=CreateStack(MaxSize){
		while(T||!IsEmpty(S)){
			while(T){
				Push(S,T);
				printf("%5d",T->Data);
				T=T->Left;
			}
			if(!IsEmpty(S)){
				T=Pop(S);
				T=T->Right;
			}
		}
	}
}

3.3.3 层序遍历

在这里插入图片描述

在这里插入图片描述

//层序遍历
void LevelOrderTraversal(BinTree BT){
	Queue Q;
	BinTree T;
	if(!BT){
		return;
	}
	Q=CreateQueue(MaxSize);
	AddQ(Q,BT);
	while(!IsEmptyQ(Q)){
		T=DeleteQ(Q);
		printf("%d\n",T->Data);
		if(T->Left){
			AddQ(Q,T->Left);
		}
		if(T->Right){
			AddQ(Q,T->Right);
		} 
	}
} 

3.3.4 遍历应用例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小白专场

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1

struct TreeNode{
	ElementType Element;
	Tree Left;
	Tree Right;
}T1[MaxTree],T2[MaxTree]; 

Tree BuildTree(struct TreeNode T[]){
	Tree Root;
	int N,i,t;
	scanf("%d",&N);
	int check[MaxTree];
	char cl,cr;
	if(N){
		for(t=0;t<N;t++){
			check[t]=0;
		}
		for(i=0;i<N;i++){
			scanf(" %c %c %c",&T[i].Element,&cl,&cr);
			if(cl!='-'){
				T[i].Left=cl-'0';
				check[T[i].Left]=1;
			}else{
				T[i].Left=Null;
			}
			if(cr!='-'){
				T[i].Right=cr-'0';
				check[T[i].Right]=1;
			}else{
				T[i].Right=Null;
			}
		}
		for(t=0;t<N;t++){
			if(!check[t]){
				break;
			}
		}
		Root=t;
	}
	return Root;
}

int lsomorphic(Tree R1,Tree R2){
	if((R1==Null)&&(R2==Null)){//全空 
		return 1;
	}
	if((R1==Null)&&(R2!=Null)){//一个空一个不空 
		return 0;
	}
	if(T1[R1].Element!=T2[R2].Element){//当前值不同 
		return 0;
	}
	if((T1[R1].Left==Null)&&(T2[R2].Left==Null)){//都没有左子树 
		return lsomorphic(T1[R1].Right,T2[R2].Right);
	}
	if(((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&&((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element))){//都存在左子树且值相同,则递归判断左子树和右子树是否同构 
		return (lsomorphic(T1[R1].Left,T2[R2].Left)&&lsomorphic(T1[R1].Right,T2[R2].Right));
	}else{
		return (lsomorphic(T1[R1].Left,T2[R2].Right)&&lsomorphic(T1[R1].Right,T2[R2].Left));//否则判断相互左右子树是否同构 
	}
}

int main(){
	Tree R1,R2;
	R1=BuildTree(T1);
	R2=BuildTree(T2);
	if(lsomorphic(R1,R2)){
		printf("Yes\n");
	}else{
		printf("No\n");
	}
	return 0;
} 

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

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

相关文章

【深度解析】图解Deepseek-V3模型架构-混合专家模型(MoE)

一、引言 最近非常火爆的DeepSeek-V3模型&#xff0c;是一个包含6710亿总参数的强大混合专家模型&#xff08;MoE&#xff09;&#xff0c;其中每个token激活370亿参数。该模型在DeepSeek-V2验证有效的核心架构基础上&#xff0c;采用多头潜在注意力&#xff08;MLA&#xff0…

c#判断exe文件是不是7z或者rar的自解压文件

亲测可以实现检测7z的自解压&#xff0c;但是对于rar的自解压格式&#xff0c;最新版不支持&#xff0c;尝试修改回发现几乎检测成了exe文件&#xff0c;这显然是不正确的&#xff0c;其他版本未测试。 如下图所示&#xff0c;可以检测出自解压格式的7z文件&#xff0c;黑色显…

富士SC2022,C325,C328打印机扫描到网络详细教程

前言&#xff1a; 在开始教程之前,我先声明目前该教程适用于FujiXerox apeos C325Z和FujiXerox DocuCentre SC2022打印机。这次教程以FujiXerox DocuCentre SC2022为例&#xff0c;该打印机IP地址为10.40.11.240。 前提条件 &#xff1a; 1. 安装打印机所需打印机和扫…

人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)

一.项目文件概述 二.数据读取模块配置 实际代码运行时是先定义与加载好模型&#xff0c;然后再去读取数据进来传入到模型网络中去训练。但现在反过来先读取数据开始。 进入ModelNetDataLoader类的_getitem方法, 做标准化的目的是处理异常大的数值 上面返回的cls是类别,相当于…

IP 路由基础 | 路由条目生成 / 路由表内信息获取

注&#xff1a;本文为 “IP 路由” 相关文章合辑。 未整理去重。 IP 路由基础 秦同学学学已于 2022-04-09 18:44:20 修改 一. IP 路由产生背景 我们都知道 IP 地址可以标识网络中的一个节点&#xff0c;并且每个 IP 地址都有自己的网段&#xff0c;各个网段并不相同&#xf…

java后端开发day16--字符串(二)

&#xff08;以下内容全部来自上述课程&#xff09; 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 作用…

LabVIEW危化品仓库的安全监测系统

本案例展示了基于LabVIEW平台设计的危化品仓库安全监测系统&#xff0c;结合ZigBee无线通信技术、485串口通讯技术和传感器技术&#xff0c;实现了对危化品仓库的实时无线监测。该系统不仅能提高安全性&#xff0c;还能大幅提升工作效率&#xff0c;确保危化品仓库的安全运营。…

深度学习框架探秘|Keras 应用案例解析以及 Keras vs TensorFlow vs PyTorch

引言 上一篇文章《深度学习框架探秘&#xff5c;Keras&#xff1a;深度学习的魔法钥匙》 我们初步学习了 Keras&#xff0c;包括它是什么、具备哪些优势&#xff08;简洁易用的 API、强大的兼容性、广泛的应用领域&#xff09;&#xff0c;以及基本使用方法。本文&#xff0c;…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换&#xff08;SNAT&#xff0c;Source NAT&#xff09;&#xff1a; 目标地址转换&#xff08;DNAT&#xff0c;Destination NAT&#xff09;&#xff1a; 端口地址转换&#xff08;PAT&#xff0c…

容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案

一、docker 部署kafka单节点 1.1安装docker 可以参考这篇CentOS 7安装docker并配置镜像加速 1.3 运行kafka&#xff08;注意修改zookeeper&#xff0c;kafka地址&#xff09; docker run -d --name kafka -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://172.16.10.180:9092 -p …

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…

thingboard告警信息格式美化

原始报警json内容&#xff1a; { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…

OpenHarmonry 5.0.1源码下载与编译

预置环境&#xff1a;硬盘500G、内存32G、Ubuntu 20.04.6 LTS Ubuntu系统下载路径&#xff1a;ubuntu-releases安装包下载_开源镜像站-阿里云 一、必需环境 sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf…

STM32 外部中断和NVIC嵌套中断向量控制器

目录 背景 外部中断/事件控制器(EXTI) 主要特性 功能说明 外部中断线 嵌套向量中断控制器 特性 ‌中断线&#xff08;Interrupt Line&#xff09; 中断线的定义和作用 STM32中断线的分类和数量 优先级分组 抢占优先级&#xff08;Preemption Priority&#xff09; …

string类详解(上)

文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …

【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法

每天一篇Go语言干货&#xff0c;从核心到百万并发实战&#xff0c;快来关注魔法小匠&#xff0c;一起探索Go语言的无限可能&#xff01; 在 Go 语言中&#xff0c;Goroutine 是一种轻量级的并发执行单元&#xff0c;它使得并发编程变得简单高效。而 Goroutine 的高效调度机制是…

【前端】Vue组件库之Element: 一个现代化的 UI 组件库

文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能&#xff1a;开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手&#xff1a;三步开启组件化开发1、安装&#xff08;使用Vue 3&#xff09;2、全局引入3、按需导入&#xff08;推荐&am…

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…

DeepSeek 的创新融合:多行业应用实践探索

引言 在数字化转型的浪潮中&#xff0c;技术的融合与创新成为推动各行业发展的关键力量。蓝耘平台作为行业内备受瞩目的创新平台&#xff0c;以其强大的资源整合能力和灵活的架构&#xff0c;为企业提供了高效的服务支持。而 DeepSeek 凭借先进的人工智能技术&#xff0c;在自然…