| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 421 人关注过本帖
标题:二叉排序树问题,请帮忙纠错
只看楼主 加入收藏
陈威
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2009-10-18
结帖率:95%
收藏
 问题点数:0 回复次数:2 
二叉排序树问题,请帮忙纠错
二叉排序树的C程序——有的结果运行正确,有的结果会产生内存错误
程序中的数据在删除24时出现了内存错误!
#include <stdio.h>//输入六个整数45、24、53、12、37、9,插入数据元素13,删除数据元素24和53
#include <stdlib.h>
typedef struct BiTNode//结点结构
{
  int data;
  struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Insert(BiTree T,int e)//插入操作
{
    BiTree p=T, f=NULL, s;
    s=(BiTree)malloc(sizeof(BiTNode));
    s->data=e;  
    s->lchild=s->rchild=NULL;
    if (T==NULL) //插入 s 为新的根结点
    {  
T = s;  
    }
    else
{//查找插入位置
    while(p && p->data!=e)
{
          if (p->data>e) {f=p; p=p->lchild;}
          else {f=p; p=p->rchild;}
}
      if (p==NULL&&e <f->data)
            f->lchild = s;      // 插入 s 为 f 的左孩子
      else if(p==NULL&&e>f->data) f->rchild = s;    // 插入 s 为 f 的右孩子
  else {printf("插入出错!");exit(0);}
}
return  T;
}
void Delete(BiTree T,int x)
{
  BiTree f=NULL,p=T,q,s;

  while(p&&p->data!=x)
  {
  if(p->data>x){f=p;p=p->lchild;}
  else  
  {  f=p;p=p->rchild;}
  }
  if(p==NULL)  {printf("查找失败!");exit(0);}
  if(p->lchild==NULL)//左为空,重接右结点或左右均为空
  {
      if(f->lchild==p)  f->lchild=p->rchild;
  else  f->rchild=p->rchild;
  free(p);
  }
  else if(p->rchild==NULL)//右为空,重接左结点
  {
      if(f->lchild==p) f->lchild=p->lchild;
  else  f->rchild=p->lchild;
  free(p);
  }
  else//左右都不为空
  {
      q=p;
  s=p->lchild;
      while(s->rchild!=NULL)
  {
    q=s;s=s->rchild;
  }
      p->data=s->data;
  if(q==p)    p->lchild=s->lchild;
  else  q->rchild=s->lchild;
  free(p);
  }
}
void Inorder(BiTree T){  // 中序遍历二叉树
  if (T)
  {
      Inorder(T->lchild); // 遍历左子树
      printf("%d ",T->data);        // 访问结点
      Inorder(T->rchild);// 遍历右子树
  }
}
void Menu(BiTree T)
{
  int i,e;

  printf("1.插入元素\n");
  printf("2.删除元素\n");
  printf("3.结束\n");
  printf("请选择需要的功能:\n");

  scanf("%d",&i);
  switch(i)
  {
      case  1:
  printf("请输入要插入的元素:");
  scanf("%d",&e);
  T=Insert(T,e);
  printf("插入后中序遍历结果为:\n");
  Inorder(T);
  printf("\n");
  break;
  case  2:
  printf("请输入要删除的元素:");
  scanf("%d",&e);
  Delete(T,e);
  printf("删除后中序遍历结果为:\n");
  Inorder(T);
  printf("\n");
  break;
  default:    exit(0);  
  }
  Menu(T);
}
void main()
{
  int e,i;
  BiTree T;

  T=NULL;
  printf("请输入六个数构造二叉排序树:\n");
  for(i=1;i <7;i++)
  {
  scanf("%d",&e);
  T=Insert(T,e);
  }
  printf("此二叉排序树的中序遍历结果为:\n");
  Inorder(T);
  printf("\n");

  Menu(T);
}


希望高手帮忙看一下!
搜索更多相关主题的帖子: 纠错 
2010-01-13 16:55
doubleflygo
Rank: 2
等 级:论坛游民
帖 子:26
专家分:50
注 册:2010-1-22
收藏
得分:0 
//注意红色部分
#include <stdio.h>//输入六个整数45、24、53、12、37、9,插入数据元素13,删除数据元素24和53
#include <stdlib.h>
typedef struct BiTNode//结点结构
{
  int data;
  struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Insert(BiTree T,int e)//插入操作
{
    BiTree p=T, f=NULL, s;
    s=(BiTree)malloc(sizeof(BiTNode));
    s->data=e;  
    s->lchild=s->rchild=NULL;
    if (T==NULL) //插入 s 为新的根结点
    {  
    T = s;  
    }
    else
    {//查找插入位置
            while(p && p->data!=e) //如果当前节点不为空且节点的值不是插入的值
            {
              if (p->data>e)
                 {f=p; p=p->lchild;} //如果当前节点值大于插入的值,则记录当前节点,并将节点的左节点作为当前节点
              else
                 {f=p; p=p->rchild;} //否则,节点的右节点作为当前节点
            }
            if (p==NULL&&e <f->data) //如果当前节点为空并且插入的值小于父节点中的值;
            f->lchild = s;      // 插入 s 为 f 的左孩子
            else if(p==NULL&&e>f->data) f->rchild = s;    // 插入 s 为 f 的右孩子
            else {printf("插入出错!");exit(0);}
    }
    return  T;
}
void Delete(BiTree T,int x)
{
  BiTree f=NULL,p=T,q,s;

      while(p&&p->data!=x)
      {
        if(p->data>x)//如果节点的数值大于x,则记录当前节点,查找其左节点
            {f=p;p=p->lchild;}
        else  
            {f=p;p=p->rchild;}
      }
     if(p==NULL)
        {printf("查找失败!");exit(0);}
      if(p->lchild==NULL)//当前节点左孩子为空,重接右结点或左右均为空
      {
          if(f->lchild==p)  //当前节点为左孩子(f->data>p->data)
              f->lchild=p->rchild;
          else
              f->rchild=p->rchild;
          free(p);
      }
      else if(p->rchild==NULL)//右为空,重接左结点
      {
          if(f->lchild==p)
              f->lchild=p->lchild;
         else  
             f->rchild=p->lchild;
          free(p);
      }
      else//左右都不为空
      {
          q=p;
          s=p->lchild;
          while(s->rchild!=NULL)
          {
            q=s;
            s=s->rchild;
          }
         p->data=s->data;
          if(q==p)   
              p->lchild=s->lchild;
          else  
              q->rchild=s->lchild; //到这里删除工作已经结束,要删除的p->data,已经被s->data代替;但是p仍然指向二叉树中
          //的节点,因此如果释放,则会导致由p派生出来的子节点的地址信息全部散失在内存中,无从查找;
         // free(p);
      }
}
void Inorder(BiTree T)
{  // 中序遍历二叉树
  if (T)
  {
      Inorder(T->lchild); // 遍历左子树
      printf("%d ",T->data);        // 访问结点
      Inorder(T->rchild);// 遍历右子树
  }
}
void Menu(BiTree T)
{
  int i,e;

  printf("1.插入元素\n");
  printf("2.删除元素\n");
  printf("3.结束\n");
  printf("请选择需要的功能:\n");

  scanf("%d",&i);
  switch(i)
  {
      case  1:
          printf("请输入要插入的元素:");
          scanf("%d",&e);
          T=Insert(T,e);
          printf("插入后中序遍历结果为:\n");
          Inorder(T);
          printf("\n");
        break;
      case  2:
          printf("请输入要删除的元素:");
          scanf("%d",&e);
          Delete(T,e);
          printf("删除后中序遍历结果为:\n");
          Inorder(T);
          printf("\n");
        break;
        default:   
            exit(0);  
        break;
  }
  Menu(T);
}
void main()
{
  int e,i;
  BiTree T;

  T=NULL;
  printf("请输入六个数构造二叉排序树:\n");
  for(i=1;i <7;i++)
  {
  scanf("%d",&e);
  T=Insert(T,e);
  }
  printf("此二叉排序树的中序遍历结果为:\n");
  Inorder(T);
  printf("\n");

  Menu(T);
}
2010-01-22 17:05
rwyangguang
Rank: 2
等 级:论坛游民
帖 子:23
专家分:46
注 册:2009-7-7
收藏
得分:0 
BiTree Insert(BiTree &T,int e)//插入操作
2010-01-24 12:25
快速回复:二叉排序树问题,请帮忙纠错
数据加载中...
 
   



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

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