标题:2叉树的问题
只看楼主
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
 问题点数:0 回复次数:30 
2叉树的问题

/*[基本要求]   从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。

[测试数据]   ABCффDEфGффFффф(其中ф表示空格字符)   则输出结果为 先序:ABCDEGF   中序:CBEGDFA   后序:CGBFDBA */

#include <iostream> using namespace std; class node{ public: char data; node *left; node *right; };

class Btree{ private: node *root; void firsthelp(node *first); void middlehelp(node *first); void lasthelp(node *first); public: void init(); void creattree(char *a); void firstvisit(){firsthelp(root);} void middlevisit(){middlehelp(root);} void lastvisit(){lasthelp(root);} };

void Btree::init(){root=NULL;} void Btree::creattree(char *a) { node *s[10];//储存根节点的债 int i=0; int top=-1; int k=1;//k=1处理左子树,k=2处理右子树 node *p; while(a[i]) { switch(a[i]) { case '#': if(k==1){k=2;} else { top--; /*这句while循环到底有什么问题!!!!若改成if循环运行对这个2叉树则OK, 但不能用于其他的2叉树(比如AB#D#E#F##C##)*/ while(s[top]->right!=NULL) { top--; }

} break; default: p=new node; p->data=a[i]; p->left=p->right=NULL; s[++top]=p; if(root==NULL){root=p;} else {if(k==1){s[top-1]->left=p;} else{s[top-1]->right=p;k=1;} } } i++; } }

void Btree::firsthelp(node *first) { if(first==NULL) return; else{ cout<<first->data<<" "; firsthelp(first->left); firsthelp(first->right); }

} void Btree::middlehelp(node *first) { if(first==NULL) return; else{ middlehelp(first->left); cout<<first->data<<" "; middlehelp(first->right); }

}

void Btree::lasthelp(node *first) { if(first==NULL) return; else{ lasthelp(first->left); lasthelp(first->right); cout<<first->data<<" "; }

}

int main(){ char b[20]="ABC##DE#G##F###"; Btree a; a.init(); a.creattree(b); cout<<"先序遍历的结果"<<endl; a.firstvisit(); cout<<endl; cout<<"中序遍历的结果"<<endl; a.middlevisit(); cout<<endl; cout<<"后序遍历的结果"<<endl; a.lastvisit(); cout<<endl; return 0; }

搜索更多相关主题的帖子: class 键盘 private include public 
2004-11-12 18:02
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
得分:0 

大家帮忙看看运行这个程序看看,拜托了!!

主要问题就是里面的while 循环!!

2004-11-12 18:04
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
长,没心机看
2004-11-12 20:11
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
得分:0 

live41

斑竹大人,拜托了!

长了就慢慢看呀

2004-11-12 20:26
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

你封装得太那个了,其实先写个不封装的搞好再说嘛。

我编译了一下你的代码,运行时有问题。

2004-11-12 20:39
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

if(k==1) { k=2; } 当处理左子树时,跳去处理右子树?

else { top--; while(s[top]->right!=NULL) { top--; } } 你的top变量本来就是-1,还没归0就开始--,一直在负数?

2004-11-12 20:48
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

s[top-1]->left=p;} else{s[top-1]->right=p;k=1;}

问题大概在这里吧?top的问题。

2004-11-12 20:51
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
得分:0 

live41斑竹大人,

1:“封装得太那个了” 是什么意思??

2while(s[top]->right!=NULL) { top--; }执行这个语句时top已经不是-1了。

3:if(k==1) { k=2; } 这是遇到‘#’号时所做的处理

4 :else { top--; while(s[top]->right!=NULL) { top--; } } 如果把这个语句中的while 改为 if ,程序正确!!

5:拜托你再看认真一下,哪里 我没说清楚地很抱歉,谢谢!

2004-11-12 21:43
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

node *root; void firsthelp(node *first); public: void firstvisit(){firsthelp(root);}

那个是指,这样隐晦的调用函数没必要,还有一般结点的定义用结构而不用类。

我再看看,等一下。

2004-11-12 21:57
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
哦对了,我没看懂ABCффDEфGффFффф(其中ф表示空格字符)
这种形式没见过,我书上是另外一种,你介绍一下这个怎么回事,ABC怎么进入结点?
2004-11-12 21:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-7549-1-1.html




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

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