一棵树的存储结构可以采用双亲表示法,即父指针数组表示法。试给出相应的类定义。其中,每个树结点包含两个成员:数据域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](的主要内容,如果未能解决你的问题,请参考以下文章

使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( )

数据结构与算法(周鹏-未出版)-第六章 树-6.4 树森林

树和森林

数据结构-王道2017-第4章 树与二叉树-树森林

数据结构树---树的存储结构

数据结构--树森林