二叉排序树判定

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二叉排序树的判别

一.问题描述

1.输入一个给定的二叉树,并判断其是否为二叉排序树。

2.对给定的二叉树用链式存储结构实现。

3.输入的关键字应不同。

二.设计与主要函数的实现

注:因此程序以0代表空树的输入,故关键字输入时不能有0。

首先应对输入的二叉树进行存储,先对其节点进行创建,一个节点中应有一个数据,一个左孩子指针以及一个右孩子指针。

主要实现为:structBitNode{ int data; BitNode *lchild,*rchild; };

2.用先序遍历的递归方式创建二叉树,对数据进行逐个输入,当子树为空时输入0。

主要实现函数为:

void CreatBiTree(BitNode *&T) //二叉树的创建,按先序遍历逐个输入二叉树节点的数字,取0为空节点

{ int c; cin>>c; //该节点的值

if(c==0) { T=NULL; }

else{ T=new BitNode; T->data=c;

CreatBiTree(T->lchild);

CreatBiTree(T->rchild); } }

3.判断二叉树是否为二叉排序树。

二叉排序树的定义为:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;

首先对该二叉树进行中序遍历,再通过判断其是否递增即可知是否为二叉排序树。

中序遍历的非递归算法,并将中序遍历后的数据存于指针数组w中,该指针数组原来均存储的为0。主要函数实现:

void InOrderTraverse(BitNode *T,int *&w,SqStack &S) //非递归的中序遍历 {

InitStack(S); int e;

BitNode *p=T; int *q=w;

while(p||!StackEmpty(S)) {

if(p) {

Push(S,*p); p=p->lchild; } else {

p=Pop(S); e=(*p).data; *q=e; q++;

cout<

cout<<" "<

对中序遍历后的数据进行判断,判断其是否递增。

boolIfInc(int *&w)

{ int *p=NULL; int *q=NULL; p=w; q=p; q++; while(*q!=0)

{

if(*p>*q) { return 0; }

else { p++; q++; } }

p=NULL; q=NULL; return 1; }

三.调试

调试一向是编程中比较繁杂环节,由于编程水平还有限,我的程序中常出现不少错误。在设计中,我使用的是Visual C++ 6.0为平台。建立好CPP文件后,对代码进行编译,出现了诸多问题。比如说,引用使用错误,模板定义有误,参数前后不一致,函数无法跳出循环等错误,也存在会在语句后面丢掉分号、输入的标点符号不是英语输入中的而是中文输入中等小问题。对待这些错误需要相当大的耐性,在细心的检查后一一更正了。在编译没有错误之后开始组建。在组建出现了内存泄露,这是在编程中经常出现的问题。

出错部分:

void InOrderTraverse(BitNode *T,int *&w,SqStack *&S) { InitStack(S); int e; BitNode *p=NULL; int *q=NULL; p=T; q=w; while(p||!StackEmpty(S)) { if(p) { Push(S,p->data); p=p->lchild; } else {

e=Pop(S);*q++=e; p=p->rchild; //出错位置!

} }

p=NULL; q=NULL; } 上面标出的出错位置中,因p原来就已是空指针,其根本没有右孩子。所以会出现内存出错的提示。如图:

通过调整后对Pop()的返回值进行了变化,返回的为结点地址。修改后主要函数如下:void InOrderTraverse(BitNode *T,int *&w,SqStack&S) //非递归的中序遍历

{ InitStack(S); int e;

BitNode *p=T;

int *q=w;

while(p||!StackEmpty(S)) {

if(p) { Push(S,*p); p=p->lchild; }

else { p=Pop(S); e=(*p).data; *q=e; q++; cout<

cout<<" "<

四.经验和体会

在这次课程设计中,通过对课堂知识的复习,加深了我对二叉树建立,遍历,二叉排序树判定等知识的掌握。同时对程序设计和调试也更熟练,对于程序设计也有了更好的理解。另外我深知程序设计不光只是要得到相应的运行结果就可以的,还有考虑它的健壮性,以及与用户之间的交流,要能够直观的,简洁的表示该程序的使用方法和功能,而且还要有很好的重复使用性,这样的算法才是好的算法。我也意识到在很多方面存在不足,需要更加努力,在反复实践的过程中不断提高自己的编程能力。对自定义类型进行传参时,应特别注意是否需要进行引用。在含有结点时应注意其是否为空,若为空,则不能对其值进行赋值,而应对其地址赋值!

五.运行结果截图

是二叉排序树的结果:

相关文档
最新文档