没有合适的资源?快使用搜索试试~ 我知道了~
树与深林
资源详情
资源评论
资源推荐
第 6 章 树与森林
6-1 写出用广义表表示法表示的树的类声明,并给出如下成员函数的
实现:
(1) operator >> ( ) 接收用广义表表示的树作为输入,建立广义
表的存储表示;
(2) 复制构造函数 用另一棵表示为广义表的树初始化一棵树;
(3) operator == ( ) 测试用广义表表示的两棵树是否相等;
(4) operator << ( ) 用广义表的形式输出一棵树;
(5) 析构函数 清除一棵用广义表表示的树。
【解答】
#include <iostream.h>
#define maxSubTreeNum 20;
//最大子树
(
子表
)
个数
class GenTree;
//GenTree类的前视声明
class GenTreeNode {
//广义树结点类的声明
friend class GenTree;
private:
int utype; //结点标
志:=0, 数据; =1, 子女
GenTreeNode * nextSibling;
//utype=0, 指向第一个子女;
//
utype=1
或2, 指向
同一层下
一兄弟
union {
//联合
char RootData;
//utype=0, 根结点数据
char Childdata;
//utype=1, 子女结点数据
GenTreeNode *firstChild;
//utype=2, 指向第一个子女的指针
}
43
第 6 章 树与森林
public:
GenTreeNode ( int tp, char item ) : utype (tp), nextSibling (NULL)
{ if ( tp == 0 ) RootData = item; else ChildData = item; }
//构造函数:构造广义表表示的树的数据结点
G e n T r e e N o d e ( G e n T r e e N o d e * s o n = N U L L ) : u t y p e ( 2 ) , n e x t S i b l i n g
(NULL), firstChild ( son ) { }
//构造函数:构造广义表表示的树的子树结点
int nodetype ( ) { return utype; } //返回结
点的数据类型
char GetData ( ) { return data; }
//返回数据结点的值
GenTreeNode * GetFchild ( ) { return firstChild; }
//返回子树结点的地址
GenTreeNode * GetNsibling ( ) { return nextSibling; } //返回下
一个兄弟结点的地址
void setInfo ( char item ) { data = item; }
//将结点中的值修改为item
void setFchild ( GenTreeNode * ptr ) { firstChild = ptr; } //将结点
中的子树指针修改为ptr
void setNsinbilg ( GenTreeNode * ptr ) { nextSibling = ptr; }
};
class GenTree {
//广义树类定义
private:
GenTreeNode *first; //根指针
char retValue; //建树时
的停止输入标志
GenTreeNode *Copy ( GenTreeNode * ptr ); //复制一
个ptr指示的子树
void Traverse ( GenListNode * ptr );
//对ptr为根的子树遍历并输出
void Remove ( GenTreeNode *ptr );
//将以ptr为根的广义树结构释放
friend int Equal ( GenTreeNode *s, GenTreeNode *t ); //比较以
s和t为根的树是否相等
public:
44
第 6 章 树与森林
GenTree ( ); //构造函数
GenTree ( GenTree& t );
//复制构造函数
~GenTree ( );
//析构函数
friend int operator == ( GenTree& t1, GenTree& t2 ); //判两棵
树t1与t2是否相等
friend istream& operator >> ( istream& in, GenTree& t ); //输入
friend ostream& operator << ( ostream& out, GenTree& t );
//输出
}
(1) operator >> ( ) 接收用广义表表示的树作为输入,建立广义
表的存储表示
istream& operator >> ( istream& in, GenTree& t ) {
//友元函数, 从输入流对象in接受用广义表表示的树,建立广义表的存储表
示t。
t.ConstructTree ( in, retValue );
return in;
}
void GenTree :: ConstructTree ( istream& in, char& value ) {
//从输入流对象in接受用广义表表示的非空树,建立广义表的存储表示t。
Stack <GenTreeNode* > st (maxSubTreeNum);
//用于建表时记忆回退地址
GenTreeNode * p, q, r; Type ch;
cin >> value;
//广义树停止输入标志数据
cin >> ch; first = q = new GenTreeNode ( 0, ch ); //建立整
个树的根结点
cin >> ch; if ( ch == ‘(’ ) st.Push ( q ); //接着应
是‘(’, 进栈
cin >> ch;
while ( ch != value ) {
//逐个结点加入
switch ( ch ) {
case ‘(’ : p = new GenTreeNode <Type> ( q );
45
第 6 章 树与森林
//建立子树, p->firstChild = q
r = st.GetTop( ); st.Pop( ); //从栈中
退出前一结点
r->nextSibling = p;
//插在前一结点r之后
st.Push( p ); st.Push( q );
//子树结点及子树根结点进栈
break;
case ‘)’ : q->nextSibling = NULL; st.pop( );
//子树建成, 封闭链, 退到上层
if ( st.IsEmpty ( ) == 0 ) q = st.GetTop( );
//栈不空, 取上层链子树结点
else return 0;
//栈空, 无上层链, 算法结束
break;
case ‘,’ : break;
default : p = q;
if ( isupper (ch) ) q = new GenTreeNode ( 0, ch );
//大写字母, 建根结点
else q = new GenTreeNode ( 1, ch );
//非大写字母, 建数据结点
p->nextSibling = q;
//链接
}
cin >> ch;
}
}
(2) 复制构造函数 用另一棵表示为广义表的树初始化一棵树;
GenTree :: GenTree ( const GenTree& t ) {
//共有函数
first = Copy ( t.first );
}
GenTreeNode* GenTree :: Copy ( GenTreeNode *ptr ) {
//私有函数,复制一个ptr指示的用广义表表示的子树
GenTreeNode *q = NULL;
46
剩余17页未读,继续阅读
lhh5356
- 粉丝: 0
- 资源: 40
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0