工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1517|回复: 2

由先序中序序列建二叉树遇到的奇怪问题

[复制链接]
发表于 2007-5-7 16:30 | 显示全部楼层 |阅读模式
在VC8的环境下运行,无论输入什么,输出的结果只有一个,就是"是空树",请大家帮我看下,感激不尽,或者大家之前有编过类似的程序,可以贴出来让我参考一下,再次感谢
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#include "string"
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define NULL 0
#define MAXLEN 50
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;//定义结点

Status PrintElement( TElemType e )
{
printf("%c",e);
return OK;
}//对结点的访问,暂时为printf

Status PreOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
  if(Visit(T->data))
   if(PreOrderTraverse(T->lchild,Visit))
    if(PreOrderTraverse(T->rchild,Visit))
     return OK;
  return ERROR;
}
else return OK;
}//先序遍历
Status InOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
  if(InOrderTraverse(T->lchild,Visit))
   if(Visit(T->data))
    if(InOrderTraverse(T->rchild,Visit))
     return OK;
  return ERROR;
}
else return OK;
}//中序遍历
Status PostOrderTraverse( BiTree T, Status (* Visit)(TElemType e) )
{
if(T)
{
  if(PostOrderTraverse(T->lchild,Visit))
   if(PostOrderTraverse(T->rchild,Visit))
    if(Visit(T->data))
     return OK;
  return ERROR;
}
else return OK;
}//后序遍历

Status Search(TElemType ino[], TElemType e, int is, int n)
{
int k, b;
for(b=is; b<n; b++)
  if(ino == e)
   k = b;
if(b == n)
  k = -1;
return k;
}//依次对比ino[]中各元素,找出与pre[ps]相乘的,并返回其下标,即k的值

void CrtBT(BiTree &T, TElemType pre[], TElemType ino[], int ps, int is, int n )
{
  // 已知pre[ps..ps+n-1]为二叉树的先序序列,
  // ino[is..is+n-1]为二叉树的中序序列,本算
  // 法由此两个序列构造二叉链表
   int k;
   if (n == 0)
   T = NULL;
   else
   {
       k = Search(ino, pre[ps], is, n); // 在中序序列中查询前序中的第一个结点
       if (k == -1)
     T = NULL;
       else
    {
      T = (BiTNode*)malloc(sizeof(BiTNode));
   T->data = pre[ps];
   if (k == is) //刚好是ino的第一个元素
    T->lchild = NULL;
   else
    CrtBT(T->lchild, pre, ino, ps+1, is, k-is );//(k-is)是其左子树的长度
   if (k = is+n-1)//刚好是ino的最后一个元素
    T->rchild = NULL;
   else
    CrtBT(T->rchild, pre, ino,  ps+1+(k-is), k+1, n-(k-is)-1);//ps+1+(k-is)是其右子树的根结点,n-(k-is)-1是右子树的长度
    }//else
   } //else
} // CrtBT   

int main()
{
BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
TElemType pre[MAXLEN], ino[MAXLEN];//pre为先序序列,ino为中序序列
int ps = 0, is = 0;//pre为先序序列的下标,is为中序序列的下标
int LEN;
printf("请输入先序序列:\n");
scanf("%s",pre);
printf("\n请输入中序序列:\n");
scanf("%s",ino);
LEN = strlen(pre);//输入字符串的长度
    CrtBT(T, pre, ino, ps, is, LEN);
if(T)//树非空
{
  printf("\n建完树后,其先序序列为:\n");
     PreOrderTraverse(T, PrintElement);
  printf("\n其中序序列为:\n");
  InOrderTraverse(T, PrintElement);
  printf("\n其后序序列为:\n");
  PostOrderTraverse(T, PrintElement);
  printf("\n");
}
    else
  printf("\n是空树!");
return OK;
}
发表于 2007-5-7 21:06 | 显示全部楼层
printf("%d",T==NULL);

得到是 1
初步得到 函数 CrtBT 有错....

[ 本帖最后由 onttpi 于 2007-5-7 21:15 编辑 ]
回复

使用道具 举报

发表于 2007-5-7 21:25 | 显示全部楼层
插入几个测试点后发现,第二个else没有进入过...


search() 函数也有问题........

赶作业了....
PS: G++命令行编译好麻烦...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-6-12 23:55

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表