二叉树的基本操作

1.文件BinTreeDef.h 中实现了二叉树的链式存储结构定义:

typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; /* 左右孩子指针*/
}BiTNode,*BiTree;

2.文件BinTreeAlgo.h 中实现二叉树的基本操作(存储结构由BinTreeDef.h 定义)

Status InitBiTree(BiTree &T)
{ /* 操作结果: 构造空二叉树T */
T=NULL;
return OK;
}

void DestroyBiTree(BiTree &T)
{ /* 初始条件: 二叉树T 存在。操作结果: 销毁二叉树T */
if(T) /* 非空树*/
{
if(T->lchild) /* 有左孩子*/
DestroyBiTree(T->lchild); /* 销毁左孩子子树*/
if(T->rchild) /* 有右孩子*/
DestroyBiTree(T->rchild); /* 销毁右孩子子树*/
free(T); /* 释放根结点*/
T=NULL; /* 空指针赋0 */
}
}

#define ClearBiTree DestroyBiTree
void CreateBiTree(BiTree &T)
{ /* 按先序次序输入二叉树中结点的值,构造二叉链表表示的二叉树T。变量Nil 表示空(子)树。*/
TElemType ch;
scanf("%d",&ch);
if(ch==Nil) /* 空*/
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(OVERFLOW);
T->data=ch; /* 生成根结点*/
CreateBiTree(T->lchild); /* 构造左子树*/
CreateBiTree(T->rchild); /* 构造右子树*/
}
}

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

int BiTreeDepth(BiTree T)
{ //编写此函数
  /* 初始条件: 二叉树T 存在。操作结果: 返回T 的深度*/
int a, b, max;
		if (T != NULL) {
			a=BiTreeDepth(T->lchild)+;
			b=BiTreeDepth(T->rchild)+;
			max = a > b ? a : b;
			return(max+1);
		}
		else	return 0;
}

TElemType Root(BiTree T)
{ /* 初始条件: 二叉树T 存在。操作结果: 返回T 的根*/
if(BiTreeEmpty(T))
return Nil;
else
return T->data;
}
void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType))
{ /* 初始条件: 二叉树T 存在,Visit 是对结点操作的应用函数。*/
/* 操作结果: 先序递归遍历T,对每个结点调用函数Visit 一次且仅一次*/
if(T) /* T 不空*/
{
Visit(T->data); /* 先访问根结点*/
PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树*/
PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树*/
}
}
void InOrderTraverse(BiTree T,Status(*Visit)(TElemType))
{//编写此函数 
/* 初始条件: 二叉树T 存在,Visit 是对结点操作的应用函数*/
/* 操作结果: 中序递归遍历T,对每个结点调用函数Visit 一次且仅一次*/
  if (T)
		{
			PreOrderTraverse(T->lchild, Visit);
			Visit(T->data);
			PreOrderTraverse(T->rchild, Visit);
		}
}
void PostOrderTraverse(BiTree T,Status(*Visit)(TElemType))
{ //编写此函数 
/* 初始条件: 二叉树T 存在,Visit 是对结点操作的应用函数*/
/* 操作结果: 后序递归遍历T,对每个结点调用函数Visit 一次且仅一次*/
  if(T)
		{
		PreOrderTraverse(T->lchild, Visit);
		PreOrderTraverse(T->rchild, Visit);
		Visit(T->data);
		}
}

3.在文件BinTreeUse.cpp 中,测试二叉树基本算法的调用

/* BinTreeUse.cpp 检验BinTreeAlgo.h 的主程序 */
#include"pubuse.h" /* 与实验一的意义相同*/
TElemType Nil=0;
#include"BinTreeDef.h" /* 二叉树链式存储结构定义*/
#include"BinTreeAlgo.h" /* 二叉树基本算法和扩展算法定义*/
Status visitT(TElemType e)
{  
printf("%d ",e);return OK;
}
void main()
 {  int i;
   BiTree T,p,c;
   TElemType e1,e2;
/* 基本实验算法的验证*/
   InitBiTree(T);
 printf("构造空二叉树后,树空否?%d(1:是0:否) 树的深度=%d\n", 
BiTreeEmpty(T),BiTreeDepth(T));
   e1=Root(T);
   if(e1!=Nil)
     printf("二叉树的根为: %d\n",e1);
  else
    printf("树空,无根\n");
  printf("请先序输入二叉树\n");  //注:自己设计一棵二叉树输入
  CreateBiTree(T);
  printf("建立二叉树后,树空否?%d(1:是0:否) 树的深度=%d\n",BiTreeEmpty(T),                                                            BiTreeDepth(T));
  e1=Root(T);
  if(e1!=Nil)
    printf("二叉树的根为: %d\n",e1);
else
printf("树空,无根\n");
printf("中序递归遍历二叉树:\n");
InOrderTraverse(T,visitT);
printf("后序递归遍历二叉树:\n");
PostOrderTraverse(T,visitT);
}

代码运行如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值