| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4280 人关注过本帖
标题:关于二叉排序树中序遍历的问题
只看楼主 加入收藏
陈威
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2009-10-18
结帖率:95%
收藏
已结贴  问题点数:10 回复次数:7 
关于二叉排序树中序遍历的问题
#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("insert wrong!");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("search fail!");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.input\n");
  printf("2.delete\n");
  printf("3.end\n");
  printf("choice:\n");

  scanf("%d",&i);
  switch(i)
  {
      case  1:
          printf("input element:");
          scanf("%d",&e);
          T=Insert(T,e);
          printf("inorder:\n");
          Inorder(T);
          printf("\n");
        break;
      case  2:
          printf("delete element:");
          scanf("%d",&e);
          Delete(T,e);
          printf("inorder:\n");
          Inorder(T);
          printf("\n");
        break;
        default:   
            exit(0);  
        break;
  }
  Menu(T);
}
void main()
{
  int e,i;
  BiTree T;

  T=NULL;
  printf("input 6 num:\n");
  for(i=1;i <7;i++)
  {
  scanf("%d",&e);
  T=Insert(T,e);
  }
  printf("inorder:\n");
  Inorder(T);
  printf("\n");

  Menu(T);
  getch();
}
搜索更多相关主题的帖子: 遍历 
2010-02-05 07:20
playmyself
Rank: 5Rank: 5
来 自:第3系4级宇宙空间
等 级:职业侠客
帖 子:76
专家分:399
注 册:2009-7-8
收藏
得分:2 
void Inorder(BiTree T)
{  /* 中序遍历二叉树   */
  if (T)
  {
      Inorder(T->lchild); /* A */
      printf("%d ",T->data);        /* B */
      Inorder(T->rchild);/* C */
  }
}

其实就是递归,从根结点开始第1层递归执行A的时候,没法执行B,因为执行A时调用了第2层递归的A语句去找左子树,第2次递归执行再调用A,一直调用到最左面的叶结点才返回。
这时可能有N层递归,返回到N-1层递归时执行2,然后执行3再向上返回,上面的继续执行....类似的,直到全部遍历完成。

无聊创造奇迹。
2010-02-05 10:40
xinjinlong
Rank: 3Rank: 3
来 自:河南南阳
等 级:论坛游侠
帖 子:61
专家分:117
注 册:2010-1-19
收藏
得分:2 
程序代码:
void Inorder(BiTree T)
{  /* 中序遍历二叉树   */
  if (T) 
  { 
      Inorder(T->lchild); /* 遍历左子树  */
      printf("%d ",T->data);        /*访问结点 */
      Inorder(T->rchild);/* 遍历右子树 */
  } 
}     

第一:这段程序时递归,我想以你的水平递归你肯定很清楚是什么意思
第二:当调用该子函数时:加入传的就是根节点,他将不断的递归一直到最左的一个叶子节点,就是不断重复
第三: T位最左叶子节点是那么第一句再递归式就失败了,所有退回上一层输出②,紧接着就执行③开始递归
第四:一次类推在递归第三句时候也是严格按着1,2,3这个顺序执行
第五:你可以在纸上把图画出执行就好看一些,在每个叶子节点你可以添加两个虚叶子节点着分析程序时就更好理解
2010-02-05 10:45
陈威
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2009-10-18
收藏
得分:0 
s=(BiTree)malloc(sizeof(BiTNode)); 这个又是什么意思,怎么这样分配存储空间?
2010-02-05 11:40
陈威
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2009-10-18
收藏
得分:0 
那么先序遍历跟后序遍历该怎么写。
2010-02-05 12:21
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:2 
以下是引用playmyself在2010-2-5 10:40:34的发言:

void Inorder(BiTree T)
{  /* 中序遍历二叉树   */
  if (T)
  {
      Inorder(T->lchild); /* A */
      printf("%d ",T->data);        /* B */
      Inorder(T->rchild);/* C */
  }
}

其实就是递归,从根 ...


搞得自己很懂递归一样。。

去check下下面link下面题目看你还懂不懂递归。

https://bbs.bccn.net/thread-297155-1-1.html
2010-02-05 14:02
jomwang
Rank: 2
等 级:论坛游民
帖 子:12
专家分:16
注 册:2010-1-28
收藏
得分:2 
我怎么发觉很麻烦呢
做一个简单的输入删除不就是了吗?
2010-02-05 15:55
heckboy
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2015-2-26
收藏
得分:0 
运行崩溃了~~
2015-03-21 23:20
快速回复:关于二叉排序树中序遍历的问题
数据加载中...
 
   



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

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