一道关于二叉树的遍历问题,高手帮我来找错吧,实在改不出来了,总是有两个错误。

zhangyongnihao1 2009-12-30 01:36:51
#include<iostream.h>
#include<stdlib.h>
typedef struct BiNode
{
char data;
struct BiNode *lchild;
struct BiNode *rchild;
}
BiNode

typedef BTNode *BinTree
void createBinTree(BinTree *root)//以先序来建立二叉树
{
char ch;
if((ch=getchar())==' ')//这个代表空格,可换别的字符
*root=NULL; //建立空二叉树
else
{
*root=(BTNode*)new(sizeof(BTNode));//开辟空间,生成节点
(*root)->data=ch;
CreateBinTree(&((*root)->lchild));
CreateBinTree(&((*root)->rchild));
}
}
void PreOrder(BinTree root)//先序遍历
{
if(root!=NULL)
{
cout<< root->data;//访问根节点
PreOrder(root->lchild);//遍历左子树
PreOrder(root->rchild);//遍历右子树
}
}
vygoid InOrder(BinTree root)//中序遍历
{
if(root!=NULL)
{
PreOrder(root->lchild); //遍历左子树
cout<<root->data;//访问根节点
PreOrder(root->rchild);//遍历右子树
}
}
void PostOrder(BinTree root)//后序遍历
{
if(root!=NULL)
{
PreOrder(root->lchild);//遍历左子树
PreOrder(root->rchild);//遍历右子树
cout<<root->data);//访问根节点
}
}
void main()
{
BinTree root;
CreateBinTree(&root);
cout<<先序:;
PreOrder(root);
cout<<\n;
cout<<中序:;
InOrder(root);
cout<<\n;
cout<<后序:;
PostOrder(root);
cout<<\n;
}
...全文
128 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhuanting 2010-01-02
  • 打赏
  • 举报
回复
指针都没过关
FreddyHu 2010-01-02
  • 打赏
  • 举报
回复
楼主吧C和C++搞混了吧,*root=(BTNode*)new(sizeof(BTNode));不用这样吧,要是想这么做的话把new换成malloc,后面的没看。。下班了。。
zhangyongnihao1 2010-01-02
  • 打赏
  • 举报
回复
没有人能改了吗??
xianyuxiaoqiang 2009-12-30
  • 打赏
  • 举报
回复
不知道为什么出错的时候,看看编译器报的错误,英文看不懂的话……拿到GOOGLE上搜一下。
xianyuxiaoqiang 2009-12-30
  • 打赏
  • 举报
回复
你的typedef 都不带分号的。编译器不答应啊。
dskit 2009-12-30
  • 打赏
  • 举报
回复

#include <iostream.h>
#include <stdlib.h>
typedef struct BiNode
{
char data;
struct BiNode *lchild;
struct BiNode *rchild;
} BiNode; //分号

typedef BTNode *BinTree; //分号
void createBinTree(BinTree *root)//以先序来建立二叉树
{
char ch;
if((ch=getchar())==' ')//这个代表空格,可换别的字符
*root=NULL; //建立空二叉树
else
{
*root=(BTNode*)new(sizeof(BTNode));//开辟空间,生成节点
(*root)->data=ch;
CreateBinTree(&((*root)->lchild));
CreateBinTree(&((*root)->rchild));
}
}
void PreOrder(BinTree root)//先序遍历
{
if(root!=NULL)
{
cout < < root->data;//访问根节点
PreOrder(root->lchild);//遍历左子树
PreOrder(root->rchild);//遍历右子树
}
}
vygoid InOrder(BinTree root)//中序遍历
{
if(root!=NULL)
{
PreOrder(root->lchild); //遍历左子树
cout < <root->data;//访问根节点
PreOrder(root->rchild);//遍历右子树
}
}
void PostOrder(BinTree root)//后序遍历
{
if(root!=NULL)
{
PreOrder(root->lchild);//遍历左子树
PreOrder(root->rchild);//遍历右子树
cout < <root->data);//访问根节点
}
}
void main()
{
BinTree root;
CreateBinTree(&root);
cout < <先序:;
PreOrder(root);
cout < <\n;
cout < <中序:;
InOrder(root);
cout < <\n;
cout < <后序:;
PostOrder(root);
cout < <\n;
}


//;
zengcan 2009-12-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode {
char data;
struct BiTNode *Lchild, *Rchild; /* 左、右孩子指针 */
} *BiTree;

void CreateBiTree(struct BiTNode* T){

/* 在先序遍历二叉树的过程中输入二叉树的"先序字符串", */
/* 建立根指针为 T的二叉链表存储结构。在先序字符串中, */
/* 字符'#'表示空树,其它字母字符为结点的数据元素 */

char ch;
scanf("%c",&ch);
if (ch=='#'){
T=NULL; /* 建空树 */
}
else
{
T = (struct BiTNode*)malloc(sizeof(struct BiTNode)) ; /* "访问"操作为生成根结点 */
T->data = ch;
CreateBiTree(T->Lchild); /* 递归建(遍历)左子树 */
CreateBiTree(T->Rchild); /* 递归建(遍历)右子树 */
}/* else */
}/* CreateBiTree */

/* 先序遍历以T为根指针的二叉树 */
void PreOrder(struct BiTNode* T){
if(T){ /* T=NULL时,二叉树为空树,不做任何操作 */
printf("%c ",T->data);
PreOrder(T->Lchild); /* 先序遍历左子树 */
PreOrder(T->Rchild); /* 先序遍历右子树 */
}/* if */
}
/* 中序遍历以T为根指针的二叉树 */
void InOrder(struct BiTNode* T){
if(T){ /* T=NULL时,二叉树为空树,不做任何操作 */
InOrder(T->Lchild); /* 先序遍历左子树 */
printf("%c",T->data); /* 通过函数指针 *visit 访问根结点 */
InOrder(T->Rchild); /* 先序遍历右子树 */
}/* if */
}
/* 后序遍历以T为根指针的二叉树 */
void PostOrder(struct BiTNode* T){
if(T){ /* T=NULL时,二叉树为空树,不做任何操作 */
PostOrder(T->Lchild); /* 先序遍历左子树 */
PostOrder(T->Rchild); /* 先序遍历右子树 */
printf("%c ",T->data); /* 通过函数指针 *visit 访问根结点 */

}/* if */
}
/* 先序遍历二叉树,以 count 返回二叉树中叶子结点的数目 */
void CountLeaf(struct BiTNode* T, int &count){
if (T) {
if ((!T->Lchild)&& (!T->Rchild))
count++; /* 对叶子结点计数 */
CountLeaf( T->Lchild, count);
CountLeaf( T->Rchild, count);
} /* if */
} /* CountLeaf */

/* T指向二叉树的根,level 为 T 所指结点所在层次, */
/* 其初值为1,depth 为当前求得的最大层次,其初值为0 */
void BiTreeDepth(struct BiTNode* T, int level, int &depth){
if (T){
if (level>depth) depth=level;
BiTreeDepth(T->Lchild, level+1, depth);
BiTreeDepth(T->Rchild, level+1, depth);
}/* if */
}/* BiTreeDepth */

int main()
{
printf("请依次输入字符: AB#CD###E#F##\n");
/*BiTree T;*/
BiTNode* T;
CreateBiTree(T);
printf("先序遍历\n");
PreOrder(T);
printf("中序遍历: \n");
InOrder(T);
printf("后序遍历: \n");
PostOrder(T);

int count = 0;
CountLeaf (T,count);
printf("此二叉树叶子节点个数: %d\n",count);

int depth = 0;
BiTreeDepth(T,1,depth);
printf("此二叉树深度: %d\n",depth);
return (0);
}


小小攻城师 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
void createBinTree(BinTree *root)//以先序来建立二叉树
{
char ch;
if((ch=getchar())==' ')//这个代表空格,可换别的字符
*root=NULL; //你确定这样正确?
else
{
  *root=(new(sizeof(BTNode));//后面的就不用看了
[/Quote]
这里*不是表示指针的意思,是解引用的意思
BTNode *root; //定义一个指针,指针的名称是root而不是*root!
另外new就不用那么麻烦了。楼主是从c转来的吧?
c++的new把你想要的工作都给做了。所以
*root=(BTNode*)new(sizeof(BTNode));
这句这样就可以了 root = new BTNode;
ok
zhangyongnihao1 2009-12-30
  • 打赏
  • 举报
回复
我教材上是这样写的。template<class T>
class BiTree
{
public;
BiTree(){root=NULL;}//无参构造函数,初始一可空二叉树
BiTree(BiNode<T> *root);有参构造函数,初始化一颗二叉树,以前序序列有键盘 输入

但是我觉得我上面写的也没有错误啊。运行后的错与在typedef BTNode *BinTree 这句,不知道为什么
tian_zhi_dao 2009-12-30
  • 打赏
  • 举报
回复
把 * 去掉
pengzhixi 2009-12-30
  • 打赏
  • 举报
回复
void createBinTree(BinTree *root)//以先序来建立二叉树
{
char ch;
if((ch=getchar())==' ')//这个代表空格,可换别的字符
*root=NULL; //你确定这样正确?
else
{
*root=(BTNode*)new(sizeof(BTNode));//后面的就不用看了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧