数据结构——第5章 树和二叉树


1 二叉树

二叉树和树都属于树形结构,但两者互不包含。即二叉树不是特殊的树。

1.1 二叉树的基本概念

1.2 二叉树的顺序存储

仅适用于完全二叉树

#define MaxSize 100
typedef int ElemType; 
typedef struct TreeNode{ElemType value;//结点中的数据元素bool isEmpty;//结点是否为空 
}TreeNode;

构造结点数为MaxSize的完全二叉树t。 

TreeNode t[MaxSize];

1.3 二叉树的链式存储

1.3.1 二叉链表

typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针  
}BiNode,*BiTree; 

二叉链表具体实现:

#include<iostream>
#include<stack> 
#include<queue>
using namespace std;
typedef char ElemType; 
//二叉树的结点(链式存储)
typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针 
//	struct BiTNode *parent;//父节点指针  三叉链表 
}BiNode,*BiTree; 
//先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T){char ch;cin>>ch;if(ch=='#') T=NULL;else{T=new BiNode;T->data=ch; CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
} 
//先序遍历
void PreOrder(BiTree T){if(T!=NULL){cout<<T->data<<" ";PreOrder(T->lchild);PreOrder(T->rchild);}
} 
//中序遍历
void InOrder(BiTree T){if(T!=NULL){PreOrder(T->lchild);cout<<T->data<<" ";PreOrder(T->rchild);}
}
//后序遍历
void AfterOrder(BiTree T){if(T!=NULL){PreOrder(T->lchild);PreOrder(T->rchild);cout<<T->data<<" ";}
}
//非递归调用的先序遍历
void  PreOrderTree(BiTree T){stack<BiNode *> s;while(T||!s.empty()){while(T){cout<<T->data;s.push(T);T=T->lchild;}if(!s.empty()){T=s.top();s.pop();T=T->rchild;}}cout<<endl;
}
//非递归调用的中序遍历
void  InOrderTree(BiTree T){stack<BiNode *> s;while(T||!s.empty()){while(T){s.push(T);T=T->lchild;}if(!s.empty()){T=s.top();s.pop();cout<<T->data;T=T->rchild;}}cout<<endl;
}//非递归调用的后序遍历
void AfterOrderTree(BiTree T){stack<BiNode*> s;BiNode* lastVisited = NULL; // 记录上一个访问过的结点while (T || !s.empty()) {while (T) {s.push(T);T = T->lchild;}if (!s.empty()) {BiNode* topNode = s.top();if (topNode->rchild && topNode->rchild != lastVisited) {T = topNode->rchild;} else {cout << topNode->data;lastVisited = topNode;	s.pop();}}}cout << endl;
}
//层次遍历
void LevelOrder(BiTree T){queue<BiNode *> q;q.push(T);while(q.size()){BiNode *f=q.front();q.pop();cout<<f->data;if(f->lchild!=NULL){q.push(f->lchild);}if(f->rchild!=NULL){q.push(f->rchild);}}cout<<endl; 
} 
//复制二叉树
void Copy(BiTree T,BiTree &NewT){if(T==NULL){NewT=NULL;return;}else{NewT=new BiNode;NewT->data=T->data;Copy(T->lchild,NewT->lchild);Copy(T->rchild,NewT->rchild);}
} 
//计算二叉树的深度
int Depth(BiTree T){if(T==NULL){return 0;}int m=Depth(T->lchild);int n=Depth(T->rchild);if(m>n){return m+1;}else{return n+1;}
} 
//统计二叉树中结点的个数
int NodeCount(BiTree T){if(T==NULL) return 0;else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
} 
int main(){BiTree T;cout<<"------------------创建二叉链表(先序遍历的顺序)------------------"<<endl;CreateBiTree(T);cout<<"创建完成:";PreOrder(T);//先序遍历的顺序输出二叉树cout<<endl;cout<<"------------------先序遍历输出二叉树------------------"<<endl;PreOrderTree(T);cout<<"------------------中序遍历输出二叉树------------------"<<endl;InOrderTree(T);cout<<"------------------后序遍历输出二叉树------------------"<<endl;AfterOrderTree(T);cout<<"------------------层次遍历输出二叉树------------------"<<endl;LevelOrder(T);cout<<"------------------求深度------------------"<<endl;cout<<"深度为:"<<Depth(T)<<endl; cout<<"------------------求结点个数------------------"<<endl;cout<<"结点个数为:"<<NodeCount(T)<<endl;return 0; 
} 

求中序遍历的前驱和后继:

//找前驱
BiNode *p;//目标结点 
BiNode *pre;
BiNode *final;
void visit(BiNode *q){if(q==p){final=pre;}else{pre=q;}
//	//找后继
//	if(pre==p){
//		final=q;
//	}else{
//		pre=q;
//	}
}
void findPre(BiTree T){if(T!=NULL){T=T->lchild;visit(T);T=T->rchild;}
} 

1.3.2 线索链表

定义

typedef char ElemType;
typedef struct BiThrNode{ElemType data;struct BiThrNode *lchild,*rchild;int LTag,RTag;//左右标志,0:指向左右孩子 1:指向前驱或后继 
}BiThrNode,* BiThrTree; 

先序线索化

//先序线索化(防止转圈问题)
void PreThreadTree(BiThrNode *p,BiThrNode *pre){if(p!=NULL){//根 if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;//左if(p->LTag==0) PreThreadTree(p->lchild,pre);//右 PreThreadTree(p->rchild,pre);}
} 
void CreatePreThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
}

中序线索化

//中序线索化
void InThreadTree(BiThrNode *p,BiThrNode *pre){if(p!=NULL){InThreadTree(p->lchild,pre);if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;InThreadTree(p->rchild,pre);}
} 
void CreateInThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
}

 后序线索化

//后序线索化
void PostThreadTree(BiThrTree p,BiThrNode *pre){if(p!=NULL){//左PostThreadTree(p->lchild,pre);//右 PostThreadTree(p->rchild,pre);//根 if(p->lchild==NULL){p->LTag=1;p->lchild=pre;}else{p->LTag=0;}if(pre!=NULL&&pre->rchild==NULL){pre->RTag=0;pre->rchild=p;}else{p->RTag=0;}pre=p;}
} 
void CreatePostThreadTree(BiThrTree T){BiThrNode *pre=NULL;if(T!=NULL){InThreadTree(T,pre);if(pre->rchild==NULL){pre->RTag=1;}}
} 

1.3.3 三叉链表

typedef struct BiNode{ElemType data;//数据域 struct BiNode *lchild,*rchild;//左右孩子指针 struct BiTNode *parent;//父节点指针
}BiNode,*BiTree;

2 树

1.1 树的基本概念

树(Tree)是n(n>=0)个结点的有限集,它或为空树(n=0);或为非空树。

基本术语

结点:树中的一个独立单元

1.2 树的

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

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

相关文章

使用Spark单机版环境

在Spark单机版环境中&#xff0c;可通过多种方式进行实战操作。首先&#xff0c;可使用特定算法或数学软件计算圆周率π&#xff0c;并通过SparkPi工具验证结果。其次&#xff0c;在交互式Scala版或Python版Spark Shell中&#xff0c;可以进行简单的计算、打印九九表等操作&…

Object Detection--Loss Function:从IoU到CIoU

本篇总结Loss Function中的IoU系列代码。 1. IoU 交并集&#xff0c;两个框交集面积除以并集面积。&#xff08;论写写画画的重要性&#xff09;&#xff08;找原文看看&#xff09; """ box1[x1, y1, x2, y2] box2[x1, y1, x2, y2] return iou ""…

【WEEK5】 【DAY2】文件上传下载【中文版】

2024.3.26 Tuesday 目录 10.文件的上传和下载10.1.准备工作10.2.基础配置10.2.1.新建名为springmvc-08-file的module10.2.2.新建controller文件夹&#xff0c;applicationContext.xml文件 10.3.文件上传10.3.1.在本模块的pom.xml中导入文件上传的jar包&#xff1a;commons-file…

中国土壤总氮含量空间分布数据

总氮&#xff0c;简称为TN&#xff0c;水中的总氮含量是衡量水质的重要指标之一。总氮的定义是水中各种形态无机和有机氮的总量。包括NO3-、NO2-和NH4等无机氮和蛋白质、氨基酸和有机胺等有机氮&#xff0c;以每升水含氮毫克数计算。常被用来表示水体受营养物质污染的程度。 中…

机械结构篇之四足机器人身体设计

欢迎关注微信公众号 “四足机器人研习社”&#xff0c;本公众号的文章和资料和四足机器人相关&#xff0c;包括行业的经典教材、行业资料手册&#xff0c;同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 目录 1.躯干 2.腿部结构 a.轮腿结合式 …

Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore

没有基础的&#xff0c;请参考上一篇 彩蛋到最后一张图里找 参考链接 结果直接上图&#xff0c;没有任何业务代码 启动后&#xff0c;已经有了基本的CRUD功能&#xff0c;还扩展了批量删除&#xff0c;与动态查询 动态查询截图&#xff0c;支持分页&#xff0c;排序 实现原理…

强化学习及其在机器人任务规划中的进展与分析

源自&#xff1a;模式识别与人工智能 作者&#xff1a;张晓明 高士杰 姚昌瑀 褚誉 彭硕 “人工智能技术与咨询” 发布 摘要 强化学习可以让机器人通过与环境的交互,学习最优的行动策略,是目前机器人领域关注的重要前沿方向之一.文中简述机器人任务规划问题的形式化建模…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码

STM32之HAL开发——DMA转运串口数据

DMA功能框图&#xff08;F1系列&#xff09; 如果外设要想通过 DMA 来传输数据&#xff0c;必须先给 DMA 控制器发送 DMA 请求&#xff0c; DMA 收到请求信号之后&#xff0c;控制器会给外设一个应答信号&#xff0c;当外设应答后且 DMA 控制器收到应答信号之后&#xff0c;就会…

实现ls -l 功能,index,rindex函数的使用

index();----------------------------------------------------------------- index第一次遇到字符c&#xff0c;rindex最后一次遇到字符c&#xff0c;返回值都是从那个位置开始往后的字符串地址 #include <stdio.h> #include <sys/types.h> #include <pwd.h&g…

[HackMyVM]靶场Crossbow

kali:192.168.56.104 靶机:192.168.56.136 端口扫描 # nmap 192.168.56.136 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-26 22:17 CST Nmap scan report for crossbow.hmv (192.168.56.136) Host is up (0.0057s latency). Not shown: 997 closed tcp…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器&#xff0c;它通过光纤传输光信号&#xff0c;并利用光谱仪进行分析&#xff0c;以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算&#xff0c;它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

牛客小白月赛89(A~C)

小白赛怎么这么难打&#xff0c;是什么小白&#xff0c;我的世界小白吗。 A. 伊甸之花 给你一个数组 a&#xff0c;问你是否找出一个 不等于 a 的数组 b&#xff0c;满足 其中数值都要在 [1,m] 的范围内 直接在 a 数组上修改&#xff0c;可以发现如果改了 a[1],a[2]&#xff…

HTML(一)---【基础】

零.前言&#xff1a; 本文章对于HTML的基础知识处理的十分细节&#xff0c;适合从头学习的初学者&#xff0c;亦或是想要提升基础的前端工程师。 1.什么是HTML&#xff1f; HTML是&#xff1a;“超文本标签语言”&#xff08;Hyper Text Markup Language&#xff09; HTML不…

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后

【AI模型-机器学习工具部署】远程服务器配置Jupyter notebook或jupyter lab服务

随着AI人工智能的崛起&#xff0c;机器学习、深度学习、模型训练等技术也慢慢泛化&#xff0c;java开发有idea&#xff0c;web开发有vscode&#xff0c;那么AI开发神器肯定离不开jupyter lab&#xff08;基础版jupyter notebook&#xff09; Jupyter notebook部署 1. 安装jupy…

QT_day5:使用定时器实现闹钟

1、 程序代码&#xff1a; widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { cla…

2014年认证杯SPSSPRO杯数学建模C题(第一阶段)土地储备方案的风险评估全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 C题 土地储备方案的风险评估 原题再现&#xff1a; 土地储备&#xff0c;是指市、县人民政府国土资源管理部门为实现调控土地市场、促进土地资源合理利用目标&#xff0c;依法取得土地&#xff0c;进行前期开发、储存以备供应土地的行为。土地…

【C语言】预处理编译链接调试技巧详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.预处理 1.1 预定义符号 1.2 #define 1.2.1 #define 定义标识符 1.2.2 #define 定义宏 1.2.3 #define 替换规则 1.2.4 #和## …

HTTPS 从懵懵懂懂到认知清晰、从深度理解到落地实操

Https 在现代互联网应用中&#xff0c;网上诈骗、垃圾邮件、数据泄露的现象时有发生。为了数据安全&#xff0c;我们都会选择采用https技术。甚至iOS开发调用接口的时候&#xff0c;必须是https接口&#xff0c;才能调用。现在有部分浏览器也开始强制要求网站必须使用https&am…