| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2029 人关注过本帖
标题:二叉树有几种建立方法
只看楼主 加入收藏
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 

把压仓底的东西拿出来,其实我一直觉得树也可以用广义表那种读书写形式串的模式建立.


/*二叉树的存储结构和遍历*/
/*注意:输入数据时要求按双亲、数据、左右标志的顺序,输入数据时输入#则结束*/
/*程序以以下数据通过测试:
# 1 0
1 2 l
1 3 r
*/
#include <iostream.h>
#define max 100

class Tree
{
private:
int data;
Tree* lchild;
Tree* rchild;
public:
Tree()
{
lchild=NULL;
rchild=NULL;
}
void DisplayDLR(Tree *t);
void DisplayLDR(Tree* t);
void DisplayLRD(Tree* t);
Tree* Create();
};

Tree* Tree::Create()
{
Tree *root,*p,*q,*stack[max];
char a,b,c;
int i=0,j=0;
root=NULL;
while(1==1)
{
cout<<\"请输入双亲,若是根结点则输入#:\";
cin>>a;
cout<<\"输入要存储的数据:\";
cin>>b;
cout<<\"输入左右标志以判断结点的关系:\";
cin>>c;
if(b=='#')
break;
if(a=='#')
{
p=new Tree;
p->data=b;
root=p;
stack[i++]=p;
}
else
{
p=new Tree;
p->data=b;
while(1==1)
{
q=stack[j];
if(q->data==a)
{
if(c=='l')
q->lchild=p;
else
q->rchild=p;
stack[i++]=p;
break;
}
else
{
stack[j]=NULL;
j++;
}
}
}
}
return root;
}

/***********先序遍历************/
void Tree::DisplayDLR(Tree *t)
{
if(t==NULL)
return;
cout<<t->data<<'t';
if(t->lchild!=NULL)
DisplayDLR(t->lchild);
if(t->rchild!=NULL)
DisplayDLR(t->rchild);
}

/***********中序遍历************/
void Tree::DisplayLDR(Tree *t)
{
if(t==NULL)
return;
if(t->lchild!=NULL)
DisplayLDR(t->lchild);
cout<<t->data<<'t';
if(t->rchild!=NULL)
DisplayLDR(t->rchild);
}

/***********后序遍历************/
void Tree::DisplayLRD(Tree *t)
{
if(t==NULL)
return;
if(t->lchild!=NULL)
DisplayLRD(t->lchild);
if(t->rchild!=NULL)
DisplayLRD(t->rchild);
cout<<t->data<<'t';
}

void main()
{
Tree* t1;
Tree tree;
cout<<\"输入数据,构建二叉树:\"<<endl;
t1=tree.Push();
cout<<\"先序遍历此二叉树:\"<<endl;
tree.DisplayDLR(t1);
cout<<\"中序遍历此二叉树:\"<<endl;
tree.DisplayLDR(t1);
cout<<\"后序遍历此二叉树:\"<<endl;
tree.DisplayLRD(t1);
}

[此贴子已经被作者于2007-6-3 20:30:39编辑过]


Viva,espana!
2007-06-03 20:24
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
以下是引用nuciewth在2007-5-8 23:16:02的发言:
应该不是,我觉得层次也不错.

层次遍历就是在唱字母歌


Viva,espana!
2007-06-03 20:29
wcxwxl
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-4
收藏
得分:0 
我在层次建立时总是编译能通过,但就是得不到预期的结果,不知是怎么回事?
另外我还有个疑问:就是
node.data[node.rear++]=*root;
*p=node.data[node.front++];
请问p指向的是root实体本身,还是指向的是node.data[node.front]中的root映像,小弟实在不解,还望高手指点迷津。
2007-06-06 23:21
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
*root表示的是值,root表示的是地址,root是指针的话

Viva,espana!
2007-06-08 17:35
wcxwxl
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-4
收藏
得分:0 
但是问题在于从队列中弹出的*p是否是原来压入的那个*root,就是p与root是否指向的是同一片空间
2007-06-11 23:20
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 
我怎么看你的程序觉得是把指针root里的数据放到p指向的地址里

Viva,espana!
2007-06-12 11:56
快速回复:二叉树有几种建立方法
数据加载中...
 
   



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

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