CH5-树和二叉树

2023-11-01

文章目录


20220112171655

5.1树和二叉树

20220112171835

5.1.1 树的定义

20220112171930

20220112172058

20220112172152

5.1.2基本术语

20220112172349

  • 树的深度: 树中结点的最大层次

  • 有序树: 树中结点的各子树从左至右有次序(最左边的为第一个孩子)。

  • 无序树: 树中结点的各子树无次序

20220112172642

20220112172828

5.1.3二叉树的定义

20220112172944

20220112173104

20220113103915

20220113104036

5种基本形态

20220113104141

5.2案例引入

案例1∶数据压缩问题

20220113104651

案例2︰求解表达式的值

20220113104607

5.3抽象数据类型定义

20220113104950

20220113105103

5.4二叉树的性质

性质1

20220113105345

20220113105423

性质2

20220113105658

性质3

20220113110134

两种特殊形式的二叉树

20220113110524

5.4.1满二叉树

20220113110904

20220113111023

5.4.2完全二叉树

20220113111219

20220113111432

20220113111518

20220113111720

性质4

20220113112133

20220113112250

性质5

20220113113429

20220113113556

5.5存储结构

20220113113659

5.5.1顺序

20220113113932

//二叉树顺序存储表示#define MAXTSIZE 100
Typedef TElemType SqBiTree[MAXSTIZE]
SqBiTree bt;

20220113114238

20220113114340

20220113114601

5.5.2链式

二叉链表

20220113114804

typedef struct BiNode{
    TElemType data;
	struct BiNode *lchild, *rchild;		//左右孩纸
}BiNode,*BiTree;

20220113125117

20220113130141

三叉链表

20220113130309

typedef struct TriTNode{
    TelemType data;
	struct TriTNode *lchild,*parent,*rchild;
 }TriTNode,*TriTree;

5.6遍历二叉树

20220113131507

5.6.1.遍历二叉树

20220113132612

20220113132822

20220113133000

先序遍历

20220113133107

中序遍历

20220113133240

后序遍历

20220113133328

20220113133708

20220113134241

5.6.2遍历序列

20220113134600

例题1

20220113135236

20220113135303

20220113135330

例题2

20220113140346

5.6.3算法实现

【算法1】:先序

20220113141512

Status PreOrderTraverse(BiTree T){
    if(T==NULL)	return OK;		//空二叉树
    else{
        visit(T);					//访问根结点
        PreOrderTraverse(T->lchild);//递归遍历左子树
        PreOrderTraverse(T->rchild);//递归遍历右子树
    }
}
void Pre(BiTree *T) {
    if (T!=NULL) {
        printf("%d\t",T->data);
        pre(T->lchild);
        pre(T->rchild);
    }
}

20220113142059

【算法2】:中序

20220113142401

Status InOrderTraverse(BiTree T){
    if(T==NULL) return OK;//空二叉树
    else{
        InOrderTraverse(T->lchild);//递归遍历左子树
        visit(T);//访问根结点;
        InOrderTraverse(T->rchild);//递归遍历右子树}
    }
}

【算法3】:后序

20220113143037

Status PostOrderTraverse(BiTree T){
    if(T==NULL) return OK;//空二叉树
    else{
    	PostOrderTraverse(T->lchild);//递归遍历左子树
        PostOrderTraverse(T->rchild);//递归遍历右子树
        visit(T);//访问根结点
    }
}

算法分析

20220113143423

20220113143624

20220113144238

【算法4】:中序非递归

20220113164322

Status InOrderTraverse (BiTree T) {
    BiTree p; InitStack(S); p=T;
    while(p || !StackEmpty(S)) {
    	if(p) { 
            Push(S,p);
            p = p->lchild;
        }
        else { 
            Pop(S,q); 
            printf(%c”,q->data);
            p= q->rchild;
        }
    }
    return OK;
}

【算法5】:层次遍历

20220113170345

20220113171523

typedef struct{
	BTNode data[MaxSize];	//存放队中元素
    int front,rear;		   //队头和队尾指针
} SqQueue;					//顺序循环队列类型

void LevelOrder(BTNode *b) {
    BTNode *p;	SqQueue *qu;
    InitQueue(qu);	//初始化队列
    enQueue(qu,b);	//根结点指针进入队列
    while (!QueueEmpty(qu) ) {	//队不为空,则循环
   		deQueue(qu,p);			//出队结点p
        printf("%c ", p->data); //访问结点p
        if (p->lchild!=NULL) enQueue(qu,p->lchild);	//有左孩子时将其进队
        if (p->rchild!=NULL) enQueue(qu,p->rchild); //有右孩子时将其进队
    }
}

5.6.4算法的应用

【算法6】:二叉树的建立

20220113172443

20220113172819

Status CreateBiTree(BiTree &T) {
    scanf(&ch); 	//cin> >ch;
    if (ch== “#”) T = NULL;
    else {
    	if (!(T =(BiTNode *)malloc(sizeof(BiTNode))))
    		exit(OVERFLOW);	//T=new BiTNode;
        T->data = ch;	   	//生成根结点
        CreateBiTree(T->lchild);//构造左子树
        CreateBiTree(T->rchild);//构造右子树
    }
    return OK;
}// CreateBiTree

【算法7】:复制二叉树

20220113173950

int Copy(BiTree T,BiTree &NewT){
    if(T==NULL){//如果是空树返回0
    	NewT=NULL;return 0;
    }
    else {
        NewT=new BiTNode;
        NewT->data=T->data;
        Copy(T->lChild,NewT->lchild);
        Copy(T->rChild,NewT->rchild);
    } 
}

【算法8】:计算二叉树深度20220113185653

int Depth( BiTree T){
    if(T==NULL)	  return O;//如果是空树返回0
    else {
   		m=Depth(T->lChild);
        n =Depth(T->rChild);
        if(m>n)   return (m+1);
        else   return(n+1);
    }
}

【算法9】:计算二叉树结点总数

20220113190106

int NodeCount(BiTree T){
    if(T == NULL)
    	return O;
    else
    	return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

【算法10】:计算二叉树叶子结点总数

20220113190328

int LeadCount(BiTree T){
    if(T==NULL)		//如果是空树返回0
    	return O;
    if (T->lchild == NULL && T->rchild == NULL)
    	return 1;	//如果是叶子结点返回1
    else
    	return LeafCount(T- >lchild) +LeafCount(T->rchild);
    }

5.7线索二叉树

20220114065601

20220114065901

20220114070203

20220114070327

typedef struct BiThrNode{
    int data;
    int Itag, rtag;
    struct BiThrNode *Ichild,rchild;
}BiThrNode,*BiThrTree ;

20220114070624

20220114070932

20220114071017

20220114071137

20220114071435

5.8树和森林

20220114071831

5.8.1双亲表示法

20220114072504

20220114075406

typedef struct PTNode {
    TElemType data;
	int parent;		//双亲位置域
}PTNode;

#define MAX_TREE_SIZE 100
typedef struct {
	PTNode nodes[MAX_TREE_SIZE];
    int r, n;		//根结点的位置和结点个数
}PTree;

5.8.2孩子链表

20220114111213

20220114081026

typedef struct CTNode {
	int child;
	struct CTNode *next;
}*ChildPtr;

typedef struct {
	TElemType	data;
    ChildPtr firstchild;//孩子链表头指针
}CTBox;

typedef struct {
	CTBox nodes[MAX_TREE_SIZE];
    int n, r;//结点数和根结点的位置
}CTree;

5.8.3孩子兄弟表示法

20220114114609

typedef struct CSNode{
	ElemType data;
	struct CSNode *firstchild, *nextsibling;
}CSNode,*CSTree;

20220114115030

5.8.4树与二叉树的转换

20220114115751

20220114115722

20220114120042

20220114120207

20220114120309

20220114120452

5.8.5森林与二叉树的转化

20220114120628

20220114120730

20220114120809

20220114120859

5.8.6树与森林的遍历

20220114121129

20220114121330

先序

20220114121454

中序

20220114121525

20220114121722

5.9哈夫曼树及其应用

5.9.1基本概念

20220114122615

20220114123241

20220114123346

20220114123829

20220114123952

20220114124203

20220114130854

20220114131010

20220114131128

5.9.2构造算法

20220114131310

20220114131501

20220114134614

20220114135318

20220114140702

5.9.3算法实现

20220114141239

20220114144957

20220114204339

typedef struct {
    int weight;
	int parent, lch, rch;
}HTNode,*HuffmanTree;

void CreatHuffmanTree (HuffmanTree HT, int n){//构造哈夫曼树——哈夫曼算法
    if(n<=1)	return;
	m=2*n-1;			//数组共2n-1个元素
	HT=new HTNode[m+1]; //0号单元未用,HT[m]表示根结点
    for(i=1;i<=m;++i){  //将2n-1个元素的lch、rch、parent置为0
		HT[i].Ich=O; HT[i].rch=O; HT[i].parent=O;
	}
	for(i=1;i<=n;++i) cin>>HT[i].weight;//输入前n个元素的weight值
    //初始化结束,下面开始建立哈夫曼树
	for( i=n+1;i<=m; i++){				//合并产生n-1个结点-构造Huffman树
    	Select(HT, i-1,s1, s2);			//在HT[k](1≤k≤i-1)中选择两个其双亲域为0,
    									//且权值最小的结点,并返回它们在HT中的序号s1和s2
    HT[s1].parent=i; HT[s2].parent=i;	//表示从F中删除s1,s2
    HT[i].lch=s1; HT[i].rch=s2 ;
    //s1,s2分别作为i的左右孩子
    HT[i].weight=HT[s1].weight + HT[s2].weight;//i的权值为左右孩子权值之和
    }
}

20220114165721

5.9.4哈夫曼编码

20220114205139

20220114205608

20220114205801

20220114210845

20220114211015

20220114211049

20220114211139

20220114212440

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n){
    //从叶子到根逆向求每个字符的哈夫曼编码,存储在编码表HC中
    HC=new char *[n+1];		//分配n个字符编码的头指针矢量
    cd=new char [n];		//分配临时存放编码的动态数组空间
    cd[n-1]=1O’;			//编码结束符
    for(i=1; i<=n; ++i){	//逐个字符求哈夫曼编码
        start=n-1; c=i; f=HT[i].parent;
        while(f!=O){		//从叶子结点开始向上回溯,直到根结点
            --start;			//回溯一次start向前指一个位置
            if (HT[f].Ilchild= =c)    cd[start]= '0; //结点c是f的左孩子,则生成代码0
            else	cd[start]=1;	//结点c是f的右孩子,则生成代码1
            c=f; f=HT[f].parent;		//继续向上回溯
        }								//求出第i个字符的编码
        HC[i]= new char [n-start];		//为第i个字符串编码分配空间
        strcpy(HC[i],&cd[start]);		//将求得的编码从临时空间cd复制到HC的当前行中
    }
    delete cd;							//释放临时空间
}// CreatHuffanCode

5.9.5文件的编码和解码

20220114213446

20220114215557

20220114215616

20220114215734

20220114215853

1; i<=n; ++i){ //逐个字符求哈夫曼编码
start=n-1; c=i; f=HT[i].parent;
while(f!=O){ //从叶子结点开始向上回溯,直到根结点
–start; //回溯一次start向前指一个位置
if (HT[f].Ilchild= =c) cd[start]= '0’ ; //结点c是f的左孩子,则生成代码0
else cd[start]= ‘1’ ; //结点c是f的右孩子,则生成代码1
c=f; f=HT[f].parent; //继续向上回溯
} //求出第i个字符的编码
HC[i]= new char [n-start]; //为第i个字符串编码分配空间
strcpy(HC[i],&cd[start]); //将求得的编码从临时空间cd复制到HC的当前行中
}
delete cd; //释放临时空间
}// CreatHuffanCode




## 5.9.5文件的编码和解码

[外链图片转存中...(img-Eb60AhkD-1642168867104)]

[外链图片转存中...(img-ATRnHMgF-1642168867104)]

[外链图片转存中...(img-eWwpUqqr-1642168867105)]



[外链图片转存中...(img-JBLQcu4n-1642168867105)]

[外链图片转存中...(img-Uj4RLzFp-1642168867105)]



































本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CH5-树和二叉树 的相关文章

  • 数组目标值target两个整数,并返回它们的数组下标

    1 题目背景 给定一个整数数组nums和一个整数目标值target 请你在该数组中找出和为目标值target的那两个整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺序
  • String 在Java中的用法详解

    认识String类 和 String的使用 1 创建字符串 1 常见的构造String的方式 2 String的基本概念 2 字符串比较相等 3 字符 字节 字符串的转换 1 字符与字符串 2 字节与字符串 4 字符串常见操作 1 字符串比
  • Java多线程和操作系统多线程关系

    这篇文章要讨论的是Java编程中的多线程和操作系统中的多线程的区别问题 线程状态 首先两者的线程状态是一样的 创建 就绪 执行 阻塞 终止 其实这五个状态也是进程的状态 那么Java中的多线程 和 OS中的多线程的区别在哪里 我们先来看下O
  • 骑士宣言

    关于骑士 有很多的妙论 在中古世纪 骑士是最耀眼的战斗力 从中也延伸出了骑士的八大美德 历来很多玩家都把骑士当作最灿烂的职业 但大家却不曾想过骑士原本是一种象征意义的精神 我们来为这八大美德宣誓 谦卑 谦虚和永远将自己放在卑微的位置是骑士的
  • RabbitMQ(二):五种模式的简单介绍

    RabbitMQ 二 五种模式的简单介绍 一 Hello World 点对点 二 Work Queues 工作队列 三 Publish Subscribe 发布订阅 四 Routing 路由 五 Topics 话题 RabbitMQ 一 C

随机推荐

  • 学习笔记:SemanticStyleGAN 面向可控图像合成和编辑的组合生成先验学习

    CVPR 2022 SemanticStyleGAN Learning Compositional Generative Priors for Controllable Image Synthesis and Editing 面向可控图像合
  • MES生产管理系统如何与ERP系统集成

    MES生产管理系统和ERP企业管理系统是制造企业信息化的重要组成部分 它们在生产管理 资源计划和业务流程等方面发挥着重要作用 实现MES与ERP系统的集成 可以更好地优化企业生产流程 提高生产效率和降低成本 本文将探讨MES管理系统解决方案
  • 区块链技术开发路线

    背景陈述 已经对区块链领域的学习研究了一段时间 总体来说 前期主要是围绕bitcoin架构及其源码学习的 但对这个领域的技术开发还是不太熟悉 为了使自己对区块链领域有一个系统的学习和技术锤炼 特此总结了如下技术开发路线 来逐渐充实自己的区块
  • 育碧2k微软服务器,2K工作室更名-2K Games,育碧,全境封锁2 ——快科技(驱动之家旗下媒体)--科技改变未来...

    2K Games旗下的 硅谷工作室 Silicon Valley Studio 现更名为 第31工会 31st Union 之所以要提到这间工作室 盖因创始人Michael Condrey之前是动视 大锤工作室联合创始人 更早以前还是EA
  • C++(一)#pragma once用法

    C 一 pragma once用法 用法 C C 中 在使用预编译指令 include的时候 为了防止重复引用造成二义性 ifndef ifndef CODE BLOCK define CODE BLOCK code endif CODE
  • Python OSError: symbol cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 not defined的解决

    问题与排查 原报错信息如下 OSError opt conda lib python3 8 site packages nvidia cublas lib libcublas so 11 symbol cublasLtHSHMatmulAl
  • 动态创建class

    需要引入命名空间 using System CodeDom using System CodeDom Compiler using Microsoft CSharp using System Reflection public static
  • ASP.NET中文显示乱码之解决方法

    ASP NET很灵活 这归功于它采用文本文件方式的配置方式 另外的那种用页面标识符的方法应该是从ASP延续下来的 写ASP 程序时候碰到中文显示问题 运行后发现ASP 从数据库中读出来的中文全部变成了 解决办法 方法一 在config we
  • 程序员眼中的流量卡:需求、选择与使用

    标题 程序员眼中的流量卡 需求 选择与使用 一 流量卡的需求分析 作为程序员 我们深知数据流量在我们的工作中的重要性 无论是开发 测试还是部署 亦或是远程工作 都需要网络的支持 使用流量卡可以为我们提供一种灵活 便携的网络解决方案 让我们可
  • 如何用java POI在excel中画线_Java中使用POI在Excel单元格中画斜线—XLS格式

    Excel主要有xls和xlsx两种格式 两种格式对应的POI接口使用方法也不同 本节主要介绍一下 在xls格式的Excel单元格中如何画斜线 1 初始化HSSFWorkbook对象 初始化HSSFWorkbook对象 创建两行两列单元格
  • 【React】Fiber 实现可中断的渲染

    什么是可中断的 渲染 参照我们在 Concurrent 的奥秘 中的同步渲染和并发渲染的例子 上图是同步渲染过程 上图是并发渲染过程 我们可以看到明显的区别 同步渲染 就是完整地执行了一个很耗时的渲染 并发渲染 将原本耗时的 渲染 拆解成了
  • Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合

    文章目录 一 Labelme标注工具安装 二 json文件批量执行转化 代码1 问题一 问题二 代码2 代码3 一 Labelme标注工具安装 https github com wkentaro labelme 安装过程按照github教程
  • 1.单例模式之饿汉式

    单例模式总结 特点 构造方法私有 提供一个全局访问点 实现方式 有很多 分四篇分别总结1 饿汉式 2 懒汉式 3 注册式 4 ThreadLocal 优点 内存中只有一个实例 减少内存开销 避免对资源多重占用 设置全局访问点 严格控制访问
  • 【IDEA】IDEA 下一些 编码技巧

    1 概述 转载 这样写代码 真是帅到没有朋友 转载记录一下 防止下次找不到了
  • 操作系统(OS)

    目录 1 计算机系统层次 2 操作系统 2 1 概念 2 2 作用 1 计算机系统层次 2 操作系统 2 1 概念 任何计算机系统都包含一个基本的程序集合 称为操作系统 OS 操作系统包括 内核 进程管理 内存管理 文件管理 驱动管理 其他
  • ajax实现下拉框联动

    spring mvc bootstrap 最近在做一个新闻不发布网站 网站栏目需要实现下拉框联动 因为没有用到前端框架 因此需要自己来写 废话不多说 思路是 跳转到新闻发布页面 需要初始化一级目录 RequestMapping releas
  • 使用ODBC连接SQL Server数据库进行增删查改操作全过程

    include
  • 开发工具~nuget配置本地源

    我们在本地部署了自己的nuget服务器 有时可以需要用到nuget restore命令去恢复包包 它会从下面的nuget config里读你的配置源信息 就是在这里 我们要把内测的nuget服务器路径添加上 这样就可以了 NUGET服务配置
  • 12V输入给三节锂电池充电芯片

    12V输入3A三节锂电池充电 可用于车载给PDA MP3 MP4 数码相机 PSP游戏机 笔记本等电子数码产品充电 2A多单元高效率开关充电器 概述 HU3208A是4 0V 23V输入 2A多单元同步降压型锂离子电池充电器 适用于便携式应
  • CH5-树和二叉树

    文章目录 5 1树和二叉树 5 1 1 树的定义 5 1 2基本术语 5 1 3二叉树的定义 5种基本形态 5 2案例引入 案例1 数据压缩问题 案例2 求解表达式的值 5 3抽象数据类型定义 5 4二叉树的性质 性质1 性质2 性质3 两