请教C++中关于二叉树的创建和遍历的问题1

来源:百度知道 编辑:UC知道 时间:2024/07/05 23:49:05
编译环境VC++6.0

要求:
1 建立一个BiTree类
2 Create()函数中序递归创建任意一棵树 输入字符#表示空树
3 InOrderTraverase()函数先序递归遍历树
4 Visit()函数输出节点data值 成功返回1 失败返回0

赋值之后进入遍历时出现错误提示 内存读取错误
现在我明确地知道是visit()函数调用时的形参表写法不对 指针所指的地址指到了别处 但我不知道怎么改 请大家帮忙看看!

函数如下
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1

struct BiTreeNode
{
char data;
struct BiTreeNode *rchild;//右子树
struct BiTreeNode *lchild;//左子树
};

InCreate(struct BiTreeNode *Tnode)
{
cout<<"Input a Char:"<<endl;
char ch;
cin>>ch;
if(ch=='#')
{
cout<<"NULL Tnode"<<endl;
Tnode=NULL;
}
else
{
Tnode=(struct BiTreeNode *)malloc(sizeof(struct BiTreeNode));
Tnode->data=ch;
InCreate(Tnode->lchild);
InCreat

你的程序存在这么几个问题:
1.程序中在建立树及遍历时参数使用的是指针,而在传递时参数也就是指针本身是不能改的,因此,你在建树的过程中分配空间并将Tnode指向他实际上是没有用的,若修改的话改成引用就可以了。
2.看函数名像是中序建树和中序遍历,实际上你写的是前序遍历和建树。
3.函数中多了不少输出语句实际上是没有用的,因为你每一次调用都会输出一次,建议你都去掉,或者把输出语句放到main函数里去。

修改后的程序如下:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1

struct BiTreeNode
{
char data;
struct BiTreeNode *rchild;//右子树
struct BiTreeNode *lchild;//左子树
};

void InCreate(struct BiTreeNode *&Tnode)
{
//cout<<"Input a Char:"<<endl;
char ch;
cin>>ch;
if(ch=='#')
{
//cout<<"NULL Tnode"<<endl;
Tnode=NULL;
}
else
{
Tnode=(struct BiTreeNode *)malloc(sizeof(BiTreeNode));
Tnode->data=ch;
InCreate(Tnode->lchild);
InCreate(Tnode->rchild);
}