| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3004 人关注过本帖
标题:2叉树的问题
取消只看楼主 加入收藏
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
收藏
 问题点数:0 回复次数:7 
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
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
收藏
得分:0 

live41

斑竹大人,拜托了!

长了就慢慢看呀

2004-11-12 20:26
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
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
收藏
得分:0 

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

这样是为了类对象 a可以直接a.firstvisit()遍历,(不用参数),而firsthelp(root)要实现递归,他必须要有个参数,所以才声明这样一个HELP函数,。并不是为了封装!

2: 斑竹可以看一下最后面主函数,输入字符串为“ABC##DE#G##F###”;不是# 号的字母入债,遇# 处理右子树,再遇# 出债。(债中是 根节点)!

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

live41斑竹,

真的 很感谢你的帮助,有你这么好的斑竹,真是这个论坛的幸福!

while(s[top]->right!=NULL&&top!=0)这个语句我也想到过,但还是错了,没想到在他前面还要一句

if(top!=0) //判断一次 top--;

我对我的错误了解的很清楚了,真的很感谢!! 还有个小问题:你说的

“我再用第二个例子调试一次,发现top还出现溢出的情况,再跟踪调试,溢出发生在while里面”

你是怎么 调试的,怎么发现top有溢出的,怎么发现是在 while循环里的??

2004-11-13 13:46
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
收藏
得分:0 

谢谢 ,懂了 。跟踪调试按钮(Go (F5)),这么好的好东西怎么不早告诉我!

设置断点位置(Insert/Remove BreakPoint (F9)),自己用用 应该就懂了。

“静哥” 难道 比你还厉害,干吗要被他骂?

2004-11-13 14:32
lcf
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-10-10
收藏
得分:0 

先序:按 根——〉左子树——〉右子树的 顺序

中序:按 左子树——〉根 ——〉右子树的 顺序

后序:按 左子树——〉右子树 ——〉根的 顺序

析构函数忘写了。

你的英文不错!

2004-11-21 22:58
快速回复:2叉树的问题
数据加载中...
 
   



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

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