[数据结构]程杰 二叉树顺序结构实现_BiTreeArray

【数据结构】二叉树顺序结构实现_BiTreeArray #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 /* 存储空间初始分配量 */ 阅读详情

二叉树的顺序结构实现用到了较多的二叉树的性质

这可以参见:http://www.cnblogs.com/hanyuan/archive/2012/05/10/bintree.html

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 100 /* 存储空间初始分配量 */
#define MAX_TREE_SIZE 100 /* 二叉树的最大结点数 */

typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int TElemType;  /* 树结点的数据类型,目前暂定为整型 */
typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点  */

typedef struct
{
	int level,order; /* 结点的层,本层序号(按满二叉树计算) */
}Position;

TElemType Nil=0; /*  设整型以0为空 */

//打印元素
Status visit(TElemType c)
{
	printf("%d ",c);
	return OK;
}

/* 构造空二叉树T。因为T是固定数组,不会改变,故不需要& */
//为储存节点值的数组SqBiTree赋初值0
Status InitBiTree(SqBiTree T)
{
	int i;
	for(i=0;i<MAX_TREE_SIZE;i++)
		T[i]=Nil; /* 初值为空 */
	return OK;
}

/* 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T */
Status CreateBiTree(SqBiTree T)
{
	int i=0;
 	printf("请按层序输入结点的值(整型),0表示空结点,输999结束。结点数≤%d:\n",MAX_TREE_SIZE);
	while(i<10)
	{
		T[i]=i+1;
		/* 在非根节点&&此结点无双亲&&该节点不为空*/
		//写成T[(i+1)/2-1]与写成T[(i-1)/2]意思是一样的。因为(i+1)-(i-1)=2
		if(i!=0&&T[(i+1)/2-1]==Nil&&T[i]!=Nil) /* 此结点(不空)无双亲且不是根 */
		{
			printf("出现无双亲的非根结点%d\n",T[i]);
			exit(ERROR);
		}
		i++;
	}
	while(i<MAX_TREE_SIZE)
	{
		T[i]=Nil; /* 将空赋值给T的后面的结点 */
		i++;
	}

	return OK;
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */
Status BiTreeEmpty(SqBiTree T)
{
	if(T[0]==Nil) /* 根结点为空,则树空 */
		return TRUE;
	else
		return FALSE;
}

/* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int BiTreeDepth(SqBiTree T)
{
   int i,j=-1;
   for(i=MAX_TREE_SIZE-1;i>=0;i--) /* 找到最后一个结点 */
     if(T[i]!=Nil)
       break;
   i++;
   //此时的i代表了树中的节点数
   //在这个do-while循环中,i不变,会变化的是j
   //当i>=2^j时,j++
   //直到i<2^j时,循环会终止,j就是所求的深度了*/
   //有n个节点的完全二叉树深度=(log2n)向下取整后再加1.
   do
     j++;
   while(i>=powl(2,j));/* 计算2的j次幂。 */
   return j;
}

/* 初始条件: 二叉树T存在 */
/* 操作结果:  当T不空,用e返回T的根,返回OK;否则返回ERROR,e无定义 */
Status Root(SqBiTree T,TElemType *e)
{
	if(BiTreeEmpty(T)) /* T空 */
		return ERROR;
	else
	{
		*e=T[0];
		return OK;
	}
}

/* 会被PreOrderTraverse()调用 */
/*
运用了:
如果2k+1 <= n-1,则下标为k的节点的左子结点的下标为2k+1;否则,下标为k的节点没有左子结点.
如果2k+2 <= n-1,则下标为k的节点的右子节点的下标为2k+2;否则,下标为k的节点没有右子节点
*/
void PreTraverse(SqBiTree T,int e)
{
	visit(T[e]);
	if(T[2*e+1]!=Nil) /* 左子树不空 */
		PreTraverse(T,2*e+1);
	if(T[2*e+2]!=Nil) /* 右子树不空 */
		PreTraverse(T,2*e+2);
}

/* 初始条件: 二叉树存在 */
/* 操作结果: 先序遍历T。 */
Status PreOrderTraverse(SqBiTree T)
{
	if(!BiTreeEmpty(T)) /* 树不空 */
	 PreTraverse(T,0);
	printf("\n");
	return OK;
}

/* InOrderTraverse()调用 */
void InTraverse(SqBiTree T,int e)
{
	if(T[2*e+1]!=Nil) /* 左子树不空 */
		InTraverse(T,2*e+1);
	visit(T[e]);
	if(T[2*e+2]!=Nil) /* 右子树不空 */
		InTraverse(T,2*e+2);
}

/* 初始条件: 二叉树存在 */
/* 操作结果: 中序遍历T。 */
Status InOrderTraverse(SqBiTree T)
{
	if(!BiTreeEmpty(T)) /* 树不空 */
		InTraverse(T,0);
	printf("\n");
	return OK;
}

/* PostOrderTraverse()调用 */
void PostTraverse(SqBiTree T,int e)
{
	if(T[2*e+1]!=Nil) /* 左子树不空 */
		PostTraverse(T,2*e+1);
	if(T[2*e+2]!=Nil) /* 右子树不空 */
		PostTraverse(T,2*e+2);
	visit(T[e]);
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 后序遍历T。 */
Status PostOrderTraverse(SqBiTree T)
{
	if(!BiTreeEmpty(T)) /* 树不空 */
		PostTraverse(T,0);
	printf("\n");
	return OK;
}

/* 层序遍历二叉树 */
void LevelOrderTraverse(SqBiTree T)
{
	int i=MAX_TREE_SIZE-1,j;
	while(T[i]==Nil)
		i--; /* 找到最后一个非空结点的序号 */
	for(j=0;j<=i;j++)  /* 从根结点起,按层序遍历二叉树 */
		if(T[j]!=Nil)
			visit(T[j]); /* 只遍历非空的结点 */
	printf("\n");
}

#define ClearBiTree InitBiTree /* 在顺序存储结构中,两函数完全一样 */


/* 初始条件: 二叉树T存在,e是T中某个结点(的位置) */
/* 操作结果: 返回处于位置e(层,本层序号)的结点的值 */
TElemType Value(SqBiTree T,Position e)
{
	 return T[(int)powl(2,e.level-1)+e.order-2];
}

/* 初始条件: 二叉树T存在,e是T中某个结点(的位置) */
/* 操作结果: 给处于位置e(层,本层序号)的结点赋新值value */
Status Assign(SqBiTree T,Position e,TElemType value)
{
	int i=(int)powl(2,e.level-1)+e.order-2; /* 将层、本层序号转为矩阵的序号 */
	if(value!=Nil&&T[(i+1)/2-1]==Nil) /* 给叶子赋非空值但双亲为空 */
		return ERROR;
	else if(value==Nil&&(T[i*2+1]!=Nil||T[i*2+2]!=Nil)) /*  给双亲赋空值但有叶子(不空) */
		return ERROR;
	T[i]=value;
	return OK;
}

/* 初始条件: 二叉树T存在,e是T中某个结点 */
/* 操作结果: 若e是T的非根结点,则返回它的双亲,否则返回"空" */
TElemType Parent(SqBiTree T,TElemType e)
{
	int i;
	if(T[0]==Nil) /* 空树 */
		return Nil;
	for(i=1;i<=MAX_TREE_SIZE-1;i++)
		if(T[i]==e) /* 找到e */
			//此句写成return T[(i-1)/2];也可以
			return T[(i+1)/2-1];
	return Nil; /* 没找到e */
}


/* 初始条件: 二叉树T存在,e是T中某个结点 */
/* 操作结果: 返回e的左孩子。若e无左孩子,则返回"空" */
TElemType LeftChild(SqBiTree T,TElemType e)
{
	int i;
	if(T[0]==Nil) /* 空树 */
		return Nil;
	for(i=0;i<=MAX_TREE_SIZE-1;i++)
		if(T[i]==e) /* 找到e */
			return T[i*2+1];
	return Nil; /* 没找到e */
}

/* 初始条件: 二叉树T存在,e是T中某个结点 */
/* 操作结果: 返回e的右孩子。若e无右孩子,则返回"空" */
TElemType RightChild(SqBiTree T,TElemType e)
{
	int i;
	if(T[0]==Nil) /* 空树 */
		return Nil;
	for(i=0;i<=MAX_TREE_SIZE-1;i++)
		if(T[i]==e) /* 找到e */
			return T[i*2+2];
	return Nil; /* 没找到e */
}

/* 初始条件: 二叉树T存在,e是T中某个结点 */
/* 操作结果: 返回e的左兄弟。若e是T的左孩子或无左兄弟,则返回"空" */
TElemType LeftSibling(SqBiTree T,TElemType e)
{
	int i;
	if(T[0]==Nil) /* 空树 */
		return Nil;
	for(i=1;i<=MAX_TREE_SIZE-1;i++)
		if(T[i]==e&&i%2==0) /* 找到e且其序号为偶数(是右孩子) */
			return T[i-1];
	return Nil; /* 没找到e */
}

/* 初始条件: 二叉树T存在,e是T中某个结点 */
/* 操作结果: 返回e的右兄弟。若e是T的右孩子或无右兄弟,则返回"空" */
TElemType RightSibling(SqBiTree T,TElemType e)
{
	int i;
	if(T[0]==Nil) /* 空树 */
		return Nil;
	for(i=1;i<=MAX_TREE_SIZE-1;i++)
		if(T[i]==e&&i%2) /* 找到e且其序号为奇数(是左孩子) */
			return T[i+1];
	return Nil; /* 没找到e */
}





/* 逐层、按本层序号输出二叉树 */
void Print(SqBiTree T)
{
	int j,k;
	Position p;
	TElemType e;
	for(j=1;j<=BiTreeDepth(T);j++)
	{
		printf("第%d层: ",j);
		for(k=1;k<=powl(2,j-1);k++)
		{
			p.level=j;
			p.order=k;
			e=Value(T,p);
			if(e!=Nil)
				printf("%d:%d ",k,e);
		}
		printf("\n");
	}
}


int main()
{
	Status i;
	Position p;
	TElemType e;
	SqBiTree T;
	InitBiTree(T);
	CreateBiTree(T);
	printf("建立二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
	i=Root(T,&e);
	if(i)
		printf("二叉树的根为:%d\n",e);
	else
		printf("树空,无根\n");
	printf("层序遍历二叉树:\n");
	LevelOrderTraverse(T);
	printf("前序遍历二叉树:\n");
	PreOrderTraverse(T);
	printf("中序遍历二叉树:\n");
	InOrderTraverse(T);
	printf("后序遍历二叉树:\n");
	PostOrderTraverse(T);
	printf("修改结点的层号3、本层序号2。");
	//为结构体的层数赋值为3
	//为结构体的当前层序号赋值为2
	p.level=3;
	p.order=2;
	//在数组T中找符合p结构体要求的节点。
	e=Value(T,p);
	printf("待修改结点的原值为%d请输入新值:50 ",e);
	e=50;
	Assign(T,p,e);
	printf("前序遍历二叉树:\n");
	PreOrderTraverse(T);
	printf("结点%d的双亲为%d,左右孩子分别为",e,Parent(T,e));
	printf("%d,%d,左右兄弟分别为",LeftChild(T,e),RightChild(T,e));
	printf("%d,%d\n",LeftSibling(T,e),RightSibling(T,e));
	ClearBiTree(T);
	printf("清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
	i=Root(T,&e);
	if(i)
		printf("二叉树的根为:%d\n",e);
	else
		printf("树空,无根\n");

	return 0;
}


一个完美的二叉排序树操作 笨代码包括以下功能: (1)初始化二叉排序树 void InitBiTree(BiTree t) (2) 建立二叉排序树 BiTree CreateBiTree(void) (3)在二叉排序树上查找元素 BiTree SearchBST(BiTree t, int k) (4) 在二叉排序树上插入元素 BiTree InsertBST(BiTree *t,int k) (5) 在二叉排序树上删除元素 void DelBST(BiTree *t,int k) 立即下载

相关推荐

图像去雾常见数据集

上述数据集涵盖了室内、室外、真实和合成等多种场景,可以满足不同研究需求。在选择数据集时,建议根据具体任务的应用场景和目标选择合适的数据集,例如真实雾天图像适合模型的实际应用验证,而合成数据则适合模型的快速迭代和训练。希望本文能为从事图像去雾研究的朋友提供一些帮助!

m0_68604571的博客 6333

三:二叉树的初始化操作及应用

内容链式存储结构初始化空二叉树 InitBiTree(&T)销毁二叉树 DestroyBiTree(&T)创建二叉树 CreateBiTree(&T, definition)清空二叉树 ClearBiTree(&T)判断空二叉树 BiTreeEmpty(T)求二叉树深度 BiTreeDepth(T)求双亲 parent(T, e)求左孩子 LeftChild(T, e)求右孩子 RightChild(T, e)求左兄弟 LeftSibling(T, e)

@76135327的博客 3517

狗都能看懂的MAML原理讲解和代码实现

meta-leaning指的是元学习,元学习是深度学习的一个分支,一个好的元模型(meta-learner)应该具备对新的、少量的数据做出快速而准确的学习。通俗的来讲, 对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。如果让一个小汽车分类网络去识别不同的大货车,那效果肯定很差。而传统的CNN网络都是输入大量的数据,然后进行分类的学习。但是这样做的问题就是,神经网络的通用性太差了,根本达不到“智能”的标准。而人类的认知系统,可以通

个人学习笔记 6万+

二叉树基本操作

无摘要

m0_55250791的博客 755

Xilinx Vivado vitis IDE launch Failed \ Web installer client Obsolete 怎么办

Xilinx vitis_IDE failed Web installer client Obsolete

weixin_44820962的博客 8643

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图

本文介绍ROS的核心架构,各个文件、目录的用途、常用命令行工具、动态计算图原理。

FRIGIDWINTER的博客 6367

C语言数据结构二叉树的顺序存储基本操作

#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #define MAX_TREE_SIZE 100 // 二叉树的最大结点数 typedef char TElemType; typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点 TEle...

weixin_43700953的博客 5274

A100 NVLink集群极致优化指南

《A100 NVLink集群通信优化指南》摘要:针对A100 80G SXM机型NVLink 3.0集群,提供硬件配置检查方法(nvidia-smi topo -m)和强制启用指令。重点介绍NCCL参数调优(算法选择、低延迟协议配置)、GPUDirect RDMA启用步骤,以及单机/多机场景下的通信模式选择。包含PyTorch all_reduce基准测试方法,并给出带宽异常排查方案(dmesg检查、NCCL缓存重置)。通过CUDA Graph通信重叠和混合精度优化,可实现90%+带宽利用率。附猿界算力监控

2401_89353317的博客 583

二叉树的C语言实现

二叉树的C语言实现

李冰-冰斌 2692

2022年华为ICT大赛 全球总决赛!中文综合任务书-网络赛道真题!

2022年华为ICT大赛 全球总决赛!综合任务书-网络赛道真题-中文翻译版

君逍遥o 2402

Win10或Win11电脑找不到以太网网络适配器的解决方法

Win10或Win11电脑找不到以太网网络适配器的解决方法

Robot_PLC_HMI_Automation 653

56.【树型结构】

树

qq_69683957的博客 839

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

w0shishabi的博客 1777

数据结构——二叉树的创建,先序遍历,中序遍历,后序遍历

依次输入: 1 2 4 0 0 5 0 0 3 0 0 表示构造一个深度为3的完全二叉树 #include"iostream" #include"functional" #include"stdio.h" using namespace std; typedef struct BiTNode{ int data; BiTNode *lchild; BiTNode *rchild...

北国觅梦 455

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

二叉树的定义及基本操作

二叉树的定义及基本操作 二叉树是另一种树形结构,它的特点是每个结点至多只有两棵子树,并且,二叉树的子树有左右之分,其次序不能任意颠倒。 1、InitBiTree(&T); 操作结果:构造空二叉树 void InitBiTree(BiTree &T) { T=NULL; } 2、DestroyBiTree(&T) 初始条件:二叉树T存在 操作结果:销毁二叉树T voi

记昨日书 3721

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二叉树的创建。

崇尚简约与原始的思维路线: //还原思维的本质,抛弃条条框框的限制,2013年12月5日 23:52:41,夜深了,睡(=-ω-)zzZZ # include # include # include typedef int Status; typedef char TElemType; typedef struct BiTNode {  TElemType data;

MC_Gee 959

二叉树的基本操作(代码+注释)

前言:掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的层次遍历等。 ps:这里是个人整理的笔记,方便自己后期的复习,若有问题欢迎各位大佬前来指教! #include<stdio.h> #include<stdlib.h> #define MAXNODE 1000 typedef int ElemType; typedef struct BiNode{ ElemType data; struct BiNode *lchild,*rchild; }BiTNode,

Alex_thomas的博客 3538

数据结构之树(五)——二叉树的操作(代码篇)

这里,我将给出关于二叉树常用操作的代码,包括顺序存储结构和链式存储结构。

BackkomCoder的博客 733

二叉树的顺序存储结构

其实呢也就是将树这种有指向的二维数据 像二维数组一样存在一个线性的 一维的 数据结构中 下面来完成二叉树的顺序存储(一帮用于完全二叉树 避免内存浪费) 在顺序存储中如上图所示完成树的存储 #include<stdio.h> #include<conio.h> #define MAX_SIZE 1024 //定义顺序树类型 typedef...

viafcccy的博客 3万+

二叉树基础及二叉树顺序结构

二叉树基础及二叉树顺序结构

sy2453的博客 3171

二叉树的遍历,前序后序中序层序,递归方法和非递归方法-BUCT数据结构

文章目录根据带有空结点的前序遍历创建二叉树并进行前序遍历创建二叉树并进行中序遍历创建二叉树并进行后序遍历 根据带有空结点的前序遍历创建二叉树并进行前序遍历 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2010; struct node{ node *l,*r; char val; node(){ l=r=NULL; val=

qq_41729237的博客 583

浅谈数据结构之二叉树存储结构实现(七)

  树:是n个结点的有限集;n=0时称为空树。在任意一棵非空树中,有且只有一个特定的结点称为根结点;其余的结点可分为m(m>0)个互不相交的有限集,其中每一个有限集都是一棵子树。结点拥有的子树数称为结点的度;度为0的结点称为叶结点或者终端结点,度不为0的结点称为分支结点或者非终端结点;树的度就是树内各结点的度的最大值。   二叉树的特点有:(1).每个结点最多有两棵子树,所以二叉树不存在度...

weixin_30849403的博客 106
上一篇: [数据结构]程杰模式串匹配、KMP算法及其改进(代码)
下一篇: 链式二查树遍历代码
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值