一棵树的存储结构可以采用双亲表示法,即父指针数组表示法。试给出相应的类定义。其中,每个树结点包含两个成员:数据域data和双亲指针parent;树则有一个树结点数组NodeList[MaxSize](
Posted Roam-G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一棵树的存储结构可以采用双亲表示法,即父指针数组表示法。试给出相应的类定义。其中,每个树结点包含两个成员:数据域data和双亲指针parent;树则有一个树结点数组NodeList[MaxSize](相关的知识,希望对你有一定的参考价值。
一棵树的存储结构可以采用双亲表示法,即父指针数组表示法。试给出相应的类定义。其中,每个树结点包含两个成员:数据域data和双亲指针parent;树则有一个树结点数组NodeList[MaxSize],MaxSize表示该数组的最大结点个数,size是当前结点个数,current指示最近操作结点位置,即当前指针。
【解答】
下面给出用双亲(父指针)表示的树和树结点类定义。
template <class Type> class Tree;
template <class Type> class TreeNode //树结点类
friend class Tree<Type>;
private:
Type data; //结点数据
int parent; //父结点指针 (用结点下标表示)
;
template <class Type> class Tree //树类
private:
TreeNode<Type> *NodeList; //结点表
int Size, MaxSize; //当前结点个数及结点表结点最大个数
int current; //当前结点指针
public:
Tree ( int sz); //构造函数
~Tree ( ) delete [ ] NedeList; //析构函数
int Root ( ); //搜索根结点
void BuildRoot ( const Type& value ); //建立根结点
int FirstChild ( ); //搜索当前结点的第一个孩子
int NextSibling ( ); //搜索当前结点的下一个兄弟
int Parent ( ); //搜索当前结点的父结点
Type getData ( ); //检索当前结点数据成员的值
void setData ( const Type& value ); //修改当前结点数据成员的值
int InsertChild ( const Type& value ); //在当前结点下插入新孩子
int DeleteChild ( int i ); //删除当前结点的第i个孩子
void DeleteSubTree ( ); //删除以当前结点为根的子树
int IsEmpty ( ) return Size == 0; //判树空否
;
template <class Type> Tree<Type> :: Tree ( int sz ) : MaxSize (sz)
//构造函数, 建立父指针数组并初始化。
NodeList = new TreeNode[MaxSize]; //创建结点表
Size = 0; current = -1;
template <class Type> int Tree<Type> :: Root ( )
//搜索根结点
if ( Size != 0 ) current = 0; return 1;
current = -1; return 0;
template <class Type> int Tree<Type> :: BuildRoot ( const Type& value )
//建立树的根结点。树的根在NodeList[0]。
NodeList[0].data = value; NodeList[0].parent = -1; //根结点
Size = 1; current = 0;
template <class Type> int Tree<Type> :: FirstChild ( )
//函数执行后当前指针指到当前结点的第一个孩子结点并返回1, 若无孩子, 则当前指针为-1
//且函数返回0。
int i = current+1; //从当前位置开始找孩子
while ( i < Size && NodeList[i].parent != current ) i++;
if ( i < Size ) current = i; return 1; //当前指针指到孩子结点并返回1
current = -1; return 0;
template <class Type> int Tree<Type> :: NextSibling ( )
//函数执行后当前指针指到当前结点的下一个兄弟结点并返回1, 若无兄弟, 则当前指针为-1
//且函数返回0。
int i = current+1; //从当前位置开始找下一个兄弟
while ( i < Size && NodeList[i].parent != NodeList[current].parent ) i++;
if ( i < Size ) current = i; return 1; //当前指针指到下一个兄弟结点, 并返回1
current = -1; return 0;
template <class Type> int Tree<Type> :: Parent ( )
//函数执行后当前指针指到当前结点的父结点并返回1, 若无父结点, 则当前指针为 -1且函
//数返回0。
if ( current < Size && current > 0 ) current = NodeList[current].parent; return 1;
current = -1; return 0;
template <class Type> Type Tree<Type> :: getData ( )
//函数返回当前结点中存放的值。
if ( current != -1 ) return NodeList[current].data;
else return NULL;
template <class Type> int Tree<Type> :: InsertChild ( const Type& value )
//在树中当前结点下插入数据为value的新孩子结点, 若父指针数组已满, 则不能插入, 函数
//返回0; 若插入成功, 则函数返回1。
if ( Size < MaxSize )
NodeList[++Size].data = value; //值赋给孩子
NodeList[Size].parent = current; //链入父结点链
return 1;
else return 0;
template <class Type> int Tree<Type> :: DeleteChild ( int i )
//删除树中当前结点下的第i个孩子及其全部子孙结点, 若该结点的第i个孩子结点不存在,
//则函数返回0; 若删除成功, 则函数返回1。
int p = current, k = FirstChild ( ); //找当前结点p的第一个孩子
if ( !k ) current = p; return 0; //若未找到, 则退出
int j = 1;
while ( k && j < i ) j++; k = NextSibling ( ); //寻找当前结点的第i个兄弟
if ( !k ) current = p; return 0; //未找到
DeleteSubTree ( ); //找到, 删除以current为根的子树
current = p; return 1;
template <class Type> void Tree<Type> :: DeleteSubTree ( )
//删除以当前结点为根结点的子树。
if ( current != -1 )
int t = current; k = FirstChild ( ); //找当前结点的第一个孩子
while ( k ) //找到
int p = current; //p记下当前的孩子
k = NextSibling ( ); int q = current; //q记下下一个孩子
current = p; DeleteSubTree ( ); //删除current为根的子树
current = q;
k = t+1;
while ( k < Size ) //修改
if ( NodeList[k].parent > t ) NodeList[k].parent--;
NodeList[k-1].parent = NodeList[k].parent;
NodeList[k-1].data = NodeList[k].data;
k++;
Size--;
以上是关于一棵树的存储结构可以采用双亲表示法,即父指针数组表示法。试给出相应的类定义。其中,每个树结点包含两个成员:数据域data和双亲指针parent;树则有一个树结点数组NodeList[MaxSize](的主要内容,如果未能解决你的问题,请参考以下文章