| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3004 人关注过本帖
标题:2叉树的问题
只看楼主 加入收藏
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 

给你附上一个 二叉树吧,可以参考参考!!(包括插入,中序输出,其他的没写,不要介意)

#include<iostream.h>

struct BTreeNode { int data; BTreeNode* left; BTreeNode* right; };

class BTree { public: void Insert(int data,BTreeNode*& root); void Display(BTreeNode *root); };

void BTree::Insert(int data,BTreeNode * &root) { if(root==NULL) { root=new BTreeNode; root->left=root->right=NULL; root->data=data; } else { if(data<root->data) Insert(data,root->left); else Insert(data,root->right); } }

void BTree::Display(BTreeNode *root) { if(root!=NULL) { Display(root->left); cout<<root->data<<" "; Display(root->right); } }

void main() { BTree tree;

BTreeNode *root = NULL;

tree.Insert(24,root); tree.Insert(52,root); tree.Insert(42,root); tree.Insert(75,root); tree.Insert(1,root); tree.Insert(5,root); tree.Insert(6,root); tree.Insert(9,root);

tree.Display(root);

}


2004-11-12 22:07
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
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 

楼主 我在附上 一个 不用 函数调用的,(应该和你的意思一样)看懂了 你就明白了!!

#include<iostream.h> class Node { friend class TREE; private: int DATA; Node *LEFT; Node *RIGHT; }; class TREE { private: Node *ROOT; public: TREE() { ROOT=0; } void Build(Node *&Root,int Data); int SEACH(Node *&Root,int Data); void TREE::Display(Node *Root); ~TREE(){} }; void TREE::Build(Node *&Root,int Data) { Node *temp; Node *backtemp; if(Root==0) { Root=new Node; Root->LEFT=Root->RIGHT=0; Root->DATA=Data; } else { temp=Root; while(temp!=0) { backtemp=temp; if(Data<temp->DATA) temp=temp->LEFT; else temp=temp->RIGHT; } if(Data<backtemp->DATA) { Node *newnode=new Node; newnode->LEFT=newnode->RIGHT=0; newnode->DATA=Data; backtemp->LEFT=newnode; } else { Node *newnode=new Node; newnode->LEFT=newnode->RIGHT=0; newnode->DATA=Data; backtemp->RIGHT=newnode; } } } int TREE::SEACH(Node *&Root,int Data) { Node *temp; temp=Root; while((temp!=0) && (temp->DATA!=Data)) { if(Data<temp->DATA) { temp=temp->LEFT; } else { temp=temp->RIGHT; } } if(temp->DATA==Data) { cout<<"find it"; return 0; } else { cout<<"can not find it"; return 1; } } void TREE::Display(Node *Root) { if(Root!=NULL) { Display(Root->LEFT); cout<<Root->DATA<<endl; Display(Root->RIGHT); } } int main() { TREE T; Node *root=0; int num; T.Build(root,20); T.Build(root,52); T.Build(root,42); T.Build(root,75); T.Build(root,1); T.Build(root,5); T.Build(root,6); T.Build(root,9); T.Build(root,56); T.Build(root,23); T.Build(root,47); T.Build(root,85); T.Build(root,7); T.Build(root,32); T.Build(root,15); cout<<"display the tree:"<<endl; T.Display(root); cout<<"search:"; cin>>num; T.SEACH(root,num); return 0; }


2004-11-12 22:25
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
收藏
得分:0 
以下是引用corrupt在2004-11-12 22:07:47的发言:

给你附上一个 二叉树吧,可以参考参考!!(包括插入,中序输出,其他的没写,不要介意)

#include<iostream.h>

struct BTreeNode { int data; BTreeNode* left; BTreeNode* right; };

class BTree { public: void Insert(int data,BTreeNode*& root); void Display(BTreeNode *root); };

void BTree::Insert(int data,BTreeNode * &root) { if(root==NULL) { root=new BTreeNode; root->left=root->right=NULL; root->data=data; } else { if(data<root->data) Insert(data,root->left); else Insert(data,root->right); } }

void BTree::Display(BTreeNode *root) { if(root!=NULL) { Display(root->left); cout<<root->data<<" "; Display(root->right); } }

void main() { BTree tree;

BTreeNode *root = NULL;

tree.Insert(24,root); tree.Insert(52,root); tree.Insert(42,root); tree.Insert(75,root); tree.Insert(1,root); tree.Insert(5,root); tree.Insert(6,root); tree.Insert(9,root);

tree.Display(root);

}

偶喜欢你这棵二叉树撒~


2004-11-12 22:28
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 

^_^!!!呵呵!!多谢夸奖,我本来是错的,多亏了 live41 他们的帮忙啊!!

-------------------------------------------

本人笨,不要介意!!


2004-11-12 22:34
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用lcf在2004-11-12 22:13:24的发言:

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:49
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

唉,没看懂#的用处,不是债是栈,stack,三个#是什么?先处理右叉然后出栈又处理右叉吗?

[此贴子已经被作者于2004-11-12 23:21:36编辑过]

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

郁闷啊,这句的意思和用处到底是什么?

while(s[top]->right!=NULL) { top--; }

你想在右子树存在的时候回到上一层吗?

2004-11-12 23:34
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
else
{
 top--; //连续第二次遇到"#"号时,这里退一层
 while(s[top]-&gt;right!=NULL)
 { //当退一层的右子树存在时,再退一层,退到不存在为止
  top--;
 }
}
2004-11-12 23:37
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
太郁闷了~~~你用单步执行看top的值怎样变化,观察两个"ABC##DE#G##F###"和
"AB#D#E#F##C##",看两次用if的时候该变量的区别,从而找出if内部的修改,我郁闷,你要改好就认真看吧。不好意思,帮不了你了。
2004-11-13 00:20
快速回复:2叉树的问题
数据加载中...
 
   



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

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