树和二叉树 -数据结构(C语言实现)
读数据结构与算法分析
树的概念
- 一棵树是一些节点的集合,可以为空
- 由称做根(root)的节点以及0个或多个非空子树组成,子树都被一条来自根的有向边相连
树的实现
思路
孩子兄弟表示法:树中的每个节点中除了数据为还有两个指针,一个指向其儿子,一个指向其兄弟。
树的节点声明
typedef struct TreeNode *PrtToNode ;
struct TreeNode
{
ElementType Element ;
PrtToNode FirstChild ;
PrtToNode NextSibling ;
}
树的遍历
先序遍历
以打印文件目录为例
void ListDir(DirectoryOrFile D,int Depth) //传进第一个目录和深度(第几级)
{
if( D 是一个合法的文件目录)
{
PrintName(D,Depth) ;//先序遍历,即先访问它的名字打印出来
for(遍历 D 所有的孩子 C)
ListDir(C,Depth + 1) ; //递归调用,遍历子树
}
}
void ListDirectory(DirectoryOrFile D) //启动程序
{
ListDir(D,0) ;
}
后序遍历
以计算文件目录大小为例
void SizeDirectory(DirectoryOrFile D)
{
int TotalSize ;
TotalSize = 0 ;
if(D 是一个合法的文件目录)
{
TotalSize = FileSize(D) ;
for(D 的每个孩子 C)
TotalSize += SizeDirectory(C) ;
}
return TotalSize ;
}
二叉树
是一颗每个节点都不能由多于两个儿子的树
实现
二叉查找树:左子树关键字小于父节点,右子树关键字大于父节点
节点声明和初始化
struct TreeNode ;
typedef struct TreeNode *Poisition ;
typedef struct TreeNode *SearchTree ;
SearchTree MakeEmpty(SearchTree T) ;
Position Find(ElementType X, SearchTree T) ;
Position FindMin(SearchTree T) ;
Position FinMax(SearchTree T) ;
SearchTree Insert(ElementType X, SearchTree T) ;
SearchTree Delete(ElementType X, SearchTree T) ;
ElementType Retrieve(Poisition P) ;
struct TreeNode
{
ElementType Element ;
PtrToNode Left ;
PtrToNode Right ;
}
Find操作
Position Find(ElementType X, SearchTree T)
{
if(T == NULL)
return NULL ;
else if(X < T->Elements)
return Find(X,T->Left) ;
else if(X > T->Elements)
return Find(X,T->Right) ;
return T ;
}
FindMin和FindMax操作
递归和非递归实现
Position FindMin(SearchTree T)
{
if(T == NULL)
return NULL ;
else if(T->Left == NULL)
return T ;
else
return FindMin(T->Left) ;
}
Position FindMax(SearchTree T)
{
if(T != NULL)
while(T->Right != NULL)
T = T->Right ;
return T;
}
Insert操作
SearchTree Inesert(ElementType X, SearchTree T)
{
if(T == NULL)
{
T = malloc(sizeof(struct
TreeNode)) ;
if(T == NULL)
FatalError("内存不足") ;
T->Element = X ;
T->Left = T->Right = NULL;
}
else if(X < T->Element)
T-Left = Insert(X,T->Left) ;
else if(X > T->Element)
T-Right = Insert(X,T->Right) ;
return T ;
}
Delete操作
只有一个节点的情况,直接用子树顶替
由两个节点的情况,找到右子树最小的元素顶替它,并删除这颗树(这颗树肯定只有一个节点)
SearchTree Delete(Element X, SearchTree T)
{
Position TmpCell ;
if(T == NULL)
Error("未找到") ;
else if(X < T->Element)
T->left = Delete(X,T-Left) ;
else if(X > T->Element)
T->Right = Delete(X,T->Right) ;
else if(T->Left && T->Right)
{
TmpCell = FindMin(T->Right) ;
T->Element = TmpCell->Element ;
T->Right = Delete(TmpCell->Element,T->Right) ;
}
else
{
TmpCell = T ;
if(T->Left == NULL)
T = T->Right ;
if(T->Right == NULL)
T = T ->Left ;
free(TmpCell) ;
}
return T ;
}
树和二叉树 -数据结构(C语言实现)的更多相关文章
- [数据结构 - 第6章] 树之链式二叉树(C语言实现)
一.什么是二叉树? 1.1 定义 二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序. 1.2 二叉树的重要特性 (1)二叉树的第 i 层上节点数最多为 2n-1: (2)高 ...
- 数据结构(C语言版)-第5章 树和二叉树
5.1 树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m& ...
- 6-11-N皇后问题-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - N皇后问题 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本 ...
- 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- 【C#数据结构系列】树和二叉树
线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...
- 数据结构( Pyhon 语言描述 ) — —第10章:树
树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...
- 数据结构(C语言第2版)-----数组,广义表,树,图
任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
随机推荐
- ASP.NET WebApi 中使用swagger 构建在线帮助文档
1 在Visual Studio 中创建一个Asp.NET WebApi 项目,项目名:Com.App.SysApi(本例创建的是 .net 4.5 框架程序) 2 打开Nuget 包管理软件,查 ...
- Java日期类题目
每类题都有各种各样解决的方式,大家随意发散 分析以下需求,并用代码实现 1.已知日期字符串:"2015-10-20",将该日期字符串转换为日期对象 2.将(1)中的日期对象转换为日 ...
- flask模板语言,装饰器,路由及配置
1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...
- you don't have permission to access ...........on this server问题解决
因为刚刚开始使用新架构的项目,于是把老项目统统替换成了新的项目.配置好后,本地登录页面报 you don't have permission to access ...... on this serv ...
- 【算法笔记】B1010 一元多项式求导
1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 ...
- 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现
#include<iostream>#include<iomanip>using namespace std; typedef struct Node{ int data; s ...
- SQL优化例子
如下SQL的优化: select count(*) from ( select id,name,col1,col2 from t1 where name='xxxx' union select id ...
- jquery头像上传剪裁插件cropper的前后台demo
因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...
- vue的声明式渲染
声明式渲染 答:2018-8-23声明式渲染是vue对数据进行操作的模式,也叫做响应式渲染当dom节点上绑定了vue的对象的属性时,如果这个属性发生了改变,无需你进行其它的操作,页面上的数据会自动发生 ...
- TinyMCE:下载、安装、配置
第一步:下载 官网下载:https://www.tiny.cloud/download/ TinyMCE从4.0开始,不再支持直接下载,而是直接使用提供免费的CDN,让用户免除安装过程,可以在网站中使 ...