| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 666 人关注过本帖
标题:各位哥哥帮我看看怎么改正
取消只看楼主 加入收藏
小苏苏
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-12-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
各位哥哥帮我看看怎么改正
二叉排序树.rar (4.89 KB)
搜索更多相关主题的帖子: 哥哥 
2013-12-17 20:45
小苏苏
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-12-17
收藏
得分:0 
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"

#define OK 1
#define FALSE 0
#define TRUE 1
typedef int KeyType;
typedef int info;
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

#define EQ(a,b) ((a)==(b))
 #define LT(a,b) ((a)<(b))
 #define LQ(a,b) ((a)<=(b))


typedef struct
{
KeyType key;
//info otherinfo;
}ElemType; /* 数据元素类型 */

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



int SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p)
{/* 在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找 */
   /* 成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上 */
   /* 访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL */
if(!T) /* 查找不成功 */
{p=f;return 0;}
else if EQ(key,T->data.key)
 {p=T;return 1;}
else if LT(key,T->data.key)/*  查找成功 */
SearchBST(T->lchild,key,T,p);/* 在左子树中继续查找 */
else  SearchBST(T->rchild,key,T,p);/*  在右子树中继续查找 */
}//SearchBST




Status InsertBST(BiTree &T,ElemType e)
/* 当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE, */
{
BiTree s,p;   
if(!SearchBST(T,e.key,NULL,p))/* 查找不成功 */
   {
    s=(BiTree)malloc(sizeof(BiTNode));
       s->data=e;
       s->lchild=s->rchild=NULL;
       if(!p) T=s;/* 被插结点*s为新的根结点 */
       else if LT(e.key,p->data.key)
           p->lchild=s;/* 被插结点*s为左孩子 */
       else  p->rchild=s;/* 被插结点*s为右孩子 */
       return TRUE;
   }
else return FALSE; /* 树中已有关键字相同的结点,不再插入 */
}//InsertBST




int Delete(BiTree &p)
/* 从二叉排序树中删除结点p,并重接它的左或右子树。算法9.8 */
{
BiTree q,s;   
if(!p->rchild) /* 右子树空则只需重接它的左子树(待删结点是叶子也走此分支) */
  {
   q=p;
   p=p->lchild;
   free(q);
  }//if
else if(!p->lchild)/* 只需重接它的右子树 */
  {
   q=p;
   p=p->rchild;
   free(q);
  }//else if
else/* 左右子树均不空 */
   {
    q=p;
       s=p->lchild;
       while(s->rchild)/* 转左,然后向右到尽头(找待删结点的前驱) */
       {q=s;
       s=s->rchild;
       }
       p->data=s->data;/* s指向被删结点的"前驱"(将被删结点前驱的值取代被删结点的值) */
       if(q!=p)
           q->rchild=s->lchild; /* 重接*q的右子树 */
       else  q->lchild=s->lchild;/* 重接*q的左子树 */
       delete s;
   }//else
return OK;
}//Delete



Status DeleteBST(BiTree &T,KeyType key)
{/* 若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点, */
   /* 并返回TRUE;否则返回FALSE。算法9.7 */
if(!T)/* 不存在关键字等于key的数据元素 */
return FALSE;
else
  {
   if EQ(key,T->data.key) /* 找到关键字等于key的数据元素 */
       return Delete(T);
   else if LT(key,T->data.key)
       return DeleteBST(T->lchild,key);
   else return DeleteBST(T->rchild,key);
  }//else
}//DeleteBST





int InsertBSTD(BiTree &T)
 /* 当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE, */
   /* 否则返回FALSE。算法9.6(改) */
{
ElemType e;
printf("insert the data,until input -1:\n");     
scanf("%d",&e.key );
while(e.key!=-1)
       {
       InsertBST(T,e);
       scanf("%d",&e.key);
    }//while
return 1;
}//InsertBSTD




void PrintD(BiTree T)
{
if(T->lchild)PrintD(T->lchild);
printf("->%d",T->data.key);
if(T->rchild)PrintD(T->rchild);
}//PrintD
int DeleteBSTD(BiTree &T)
{
ElemType e;      
printf("\ninput the data you want to delete:\n");
scanf("%d",&e.key);
DeleteBST(T,e.key);
return 1;
}//DeleteBSTD





int main()
 {
       BiTree T;
       InsertBSTD(T);
       PrintD(T);
       DeleteBSTD(T);
       PrintD(T);
       return OK;
 }
2013-12-17 20:47
小苏苏
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-12-17
收藏
得分:0 
回复 3楼 不玩虚的
输入一组数的时候,不能运行,可以方便看一下么?
2013-12-18 17:06
快速回复:各位哥哥帮我看看怎么改正
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045198 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved