回 帖 发 新 帖 刷新版面

主题:[原创]大家快来看呀,这棵树是怎么回事了?

#include <stdio.h>
/*#include <dos.h>*/

typedef  int  Status;
typedef  int  ElemType;

#define  FAULS  0;
#define  OK     1;

typedef struct BiTNode{
  ElemType  data;
  struct BiTNode *lchild,*rchild;
 }BiTnode,*BiTree;

BiTree CreateTree(BiTree T){/*建立二叉树*/
  int num;
  /*BiTree base;*/

  scanf("%d",&num);
  if(num==0) T=NULL;
  else{
       T=(BiTnode*)malloc(sizeof(BiTnode));
       if(!T) exit(0);;
       T->data=num;
       CreateTree(T->lchild);
       CreateTree(T->rchild);
      }
  return T;
}
void PreTraverse(BiTree Tree){/*前序遍历*/
  if(Tree==NULL) return;
  else
    {
      printf("%d->",Tree->data);
      PreTraverse(Tree->lchild);
      PreTraverse(Tree->rchild);
    }
}

void main()
{
  BiTree T,Tree;
  Tree=CreateTree(T);
  PreTraverse(Tree);
  getch();
}
这个程序,的前序遍历,怎么不对呀,结果老是死循环.

回复列表 (共9个回复)

沙发

不是前序遍历有问题,而是你的二叉树的创建有问题。参数必须是二级指针才行,如下:
BiTree CreateTree(BiTree *T)
{
  scanf("%d",&num);
  if(num==0) 
  {
     *T=NULL;
  }
  else
  {
     ...
  }
  ...
}

板凳


为什么要用二级指针呀?

3 楼

传值和传址的问题而已

4 楼

#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef  int  Status;
typedef  int  ElemType;

#define  FALSE  0;
#define  OK     1;

typedef struct BiTNode{
    ElemType  data;
    struct BiTNode *lchild,*rchild;
}BiTnode,*BiTree;

void CreateTree(BiTree &T){/*建立二叉树*/
    int num;
    scanf("%d",&num);
    if(!num) 
        T=NULL;
    else{
        T=(BiTree)malloc(sizeof(BiTnode));
        T->data=num;
        CreateTree(T->lchild);
        CreateTree(T->rchild);
    }
}
void PreTraverse(BiTree Tree){/*前序遍历*/
    if(Tree){
      printf("%d->",Tree->data);
      PreTraverse(Tree->lchild);
      PreTraverse(Tree->rchild);
    }
}

void InOrderTraverse(BiTree Tree){/*中序遍历*/
    if(Tree){     
      InOrderTraverse(Tree->lchild);
      printf("%d->",Tree->data);
      InOrderTraverse(Tree->rchild);
    }
}

void main()
{
  BiTree T = NULL;
  CreateTree(T);
  PreTraverse(T);
  printf("\n");
  InOrderTraverse(T);
  getch();
}
//建树3(2(6,8(5)),7(,4(9(,5))))
//则应依次输入3 2 6 0 0 8 5 0 0 0 7 0 4 9 0 5 0 0 0建树,经两次编历后,结果正确

5 楼

你的创建函数不对
建树是通过递归函数实现的,
而递归函数中所建立的节点只有在函数调用期间(本函数体内)有效,函数调用结束后
不保留和返回主函数,所以你的递归函数只能创建一个左右孩子指针未知(危险的)的
data域值为第一次输入的num值的根节点,函数返回值是指向根节点的指针

6 楼


4楼,你的那个程序还是不对吧,你用的是什么编译器?我用的是TC,怎么它老是讲
void CreateTree(BiTree &T){/*建立二叉树*/
这句,说明语法错误,但是我把它改为:void CreateTree(BiTree *T){/*建立二叉树*/
时,后面的: 
      T->data=num;
        CreateTree(T->lchild);
        CreateTree(T->rchild);
都错了,讲什么:
"错误 noname.c 22: 指针必需在 -> 的左侧在 CreateTree 函数中"
"错误 noname.c 23: 指针必需在 -> 的左侧在 CreateTree 函数中"
"错误 noname.c 24: 指针必需在 -> 的左侧在 CreateTree 函数中"

7 楼

用VC
TC不支持引用类型

8 楼

以下程序在WIN-TC下编译运行正确
#include <stdio.h>
#include <malloc.h>
#include <conio.h>

typedef  int  ElemType;
typedef struct BiTNode{
    ElemType  data;
    struct BiTNode *lchild,*rchild;
}BiTnode,*BiTree;

void CreateT(BiTree *T){/*建立二叉树*/
    int num;
    scanf("%d",&num);
    if(!num) 
        *T=NULL;
    else{
        *T=(BiTree)malloc(sizeof(BiTnode));
        (*T)->data=num;
        CreateT(&(*T)->lchild);
        CreateT(&(*T)->rchild);
    }
}
void PreTraverse(BiTree T){/*前序遍历*/
    if(T){
      printf("%d->",T->data);
      PreTraverse(T->lchild);
      PreTraverse(T->rchild);
    }
}

void InOrderTraverse(BiTree T){/*中序遍历*/
    if(T){
      InOrderTraverse(T->lchild);
      printf("%d->",T->data);
      InOrderTraverse(T->rchild);
    }
}

void main()
{
  BiTree *T = (BiTree *)malloc(sizeof(BiTree));
  CreateT(T);
  PreTraverse(*T);
  printf("\n");
  InOrderTraverse(*T);
  getch();
}

9 楼


你好,我把你写的程序在win-tc下运行时,无法停止输入,是怎么回事啊?该怎么改写程序呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册