树数据结构的低冗余存储方式

原创 2006年06月11日 21:50:00

所需附加存储空间:n*size(int),n是树的节点总数

树结构由数组形式顺序存储

例:

1:F

2:F11

3:F12

4:F13

5:F14

6:F211

7:F212

8:F221

9:F231

10:F232

11:F233

13:F322

12:F321

数组1Array1):存储节点内容

 

F

F11

F12

F13

F14

F211

F212

F221

F231

F232

F232

F321

F322

 

 

 

 

 

 

 

 

 

 

 

struct      Node

{

       int    number;  //序号

       nodetype content;   //内容

};

Node       Array1[];

数组2Array2):存储树结构信息

4

2

1

3

0

0

2

0

0

0

0

0

0

 

 

 

 

 

 

 

 

 

 

 

int    Array2[];

 

提供如下标准操作:

添加节点,添加子树,删除节点,删除子树,移动子树

 

 

获得父节点:

Node*     get_father_node  (Node*     node)

{

       int    tempno    =     node->number;

       int    i      =     0;

       int    count      =     0;

       int    fatherno;

       Node*     father;

       for(  i=0   ;      count      <     tempno    ;      i++  )

       {

              count      =     count      +     Array2[i] ;

}

fatherno  =     i;     //找到父节点

father      =     &Array1[fatherno];

//需要指针越界处理

return      father;

}

 

获得第一个子节点:

Node*     get_first_son_node  (Node* node)

{

       int    tempno    =     node->number;

int    i      =     0;

int    count      =     0;

int    sonno;

Node*     son;

for(  i=0   ;      i      <     tempno    ;      i++  )

       {

              count      =     count      +     Array2[i] ;

}

sonno      =     i      -      Array2[tempno]     +     1;    //找到子节点

son  =     &Array1[sonno];

//需要指针越界处理

return      son;

}

 

获得最后一个子节点:

Node*     get_last_son_node  (Node*  node)

{

       int    tempno    =     node->number;

int    i      =     0;

int    count      =     0;

int    sonno;

Node*     son;

for(  i=0   ;      i      <     tempno    ;      i++  )

       {

              count      =     count      +     Array2[i] ;

}

sonno      =     i;     //找到子节点

son  =     &Array1[sonno];

//需要指针越界处理

return      son;

}

 

添加节点:

insertnode       (Node*    node1,     Node*     node2)    //待添加节点node2,目标节点node1

{

       Node*     aimnode  =     get_last_son_node  (node1);

       int    tempno    =     aimnode->number;

       //申请一个比原长度大1的数组

       //tempno后的数组元素依次后移一位,空出来的那一位装入node2

       //tempno后的数组Array1元素依次修改序号,根据tempno依次加一

       //tempno后的数组Array2元素如上修改,新插入位设为0

}

 

添加子树:

inserttree (Node*    node1,     Node*     node2,     int*  Array2pointer)       //待添加树首节点node2,目标节点node1Array2pointer是指向待插入树的Array2数组的指针

{

Node*     backnode1      =     node1;

Node*     backnode2      =     node2;

       insertnode       (node1,   node2);

       node1      =     node2;

int    temp       =     node2->number;

node2      =     get_first_son_node (node1);

       for(  j      =     Array2pointer[temp];     j      >     0;    j--    )

       {

              inserttree(node1,    node2,     Array2pointer);

              node2++;

}

node1      =     backnode1;

node2      =     backnode2;

}

 

删除节点:

deletenode      (Node*    node)

{

       int    temp              =     node->number;

       Node*     node1      =     get_first_son_node(node);

       Node*     father      =     get_father_node(node);

       for(i =     0;    i      <     Array2[temp]; i++  )

       {

              tree  newtree   =     deldetetree(node1);

              Node*     treenode  =     newtree.node;

              int    Array[]    =     newtree.Array;

              inserttree(father,     treenode, &Array)

              node1++;

}

}

 

删除子树:

tree  deletetree        (Node*    node)

{

       Node*     tempnode              =     node;

       Node*     headnode        =     node;

int    soncount =     Array2[node->number];

int    array1pointer  =     0;

int    array2pointer  =     0;

int    i      =     0;

Node       nowArray1[];

int           nowArray2[];

nowArray1[0]        =     *headnode;

nowArray2[0]        =     Array2[headnode->number];

array1pointer++;

array2pointer++;

       while(soncount      !=    0)

       {

              tempnode              =     get_first_son_node(tempnode);

              for(i        =     0;    i      <     soncount ;      i++  )

              {

                     nowArray1[array1pointer]     =     &tempnode+i  ;

                     nowArray1[array1pointer].number       =     array1pointer;

                     nowArray2[array2pointer]     =     Array2[tempnode+i ->    number];

                     tempnode+i     ->    number   =     -1;   //标记出需要被删除的节点

                     array1pointer++;

                     array2pointer++;

}

endcount =     soncount;

soncount =     0;

for(i        =     0;    i      <     endcount      ;      i++)

{

       soncount =     Array2[tempnode->number   +     i]     +     soncount;

}

       }//遍历到这棵树的第一个叶子节点  

       for(i        =     0;    i      <     数组长度;      i++)

       {

              if(Array1[i].number       ==   -1)

              {

                     对于Array1[]Array2[]数组,i+1开始所有元素向前挪一位;尾部删除一位,长度减一

              }

       }

       return                    nowArray1[]nowArray2[]付给一个tree形变量,返回结果,注意不是返回地址,而是复制值返回。所以两个数组必须被复制。以免函数析构后,指针悬空。

}

 

移动子树:

movetree        (Node*    node1,     Node*     node2)//node1node2未来的父节点

{

       tree*              temptree;

       temptree  =     deletetree(node2);

       inserttree(node1,    temptree->Array1)

}//剪切,粘贴

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

数据结构存储方式(C语言)

引言 C语言的精粹是程序要可以随意操纵自己程序空间的任意内存,从这方面来说,C语言编程算是面向机器的编程。那么,熟悉C的数据如何存储就是显得很重要了。本篇内容就是记录自己探索C语言的数据结构在内存如...

数据结构的几种存储方式

数据的存储结构是数据结构的一个重要内容。在计算机中,数据的存储结构可以采取如下四中方法来表现。 1)           顺序存储方式 简单的说,顺序存储方式就是在一块连续的存储区域 ...

数据结构--图的存储方式

主要写一下图的几种表示方法。 今天写的几种图存储结构包括邻接矩阵,邻接表,十字链表,邻接多重表,边集数组。 主要是邻接表,十字链表和邻接多重表。邻接矩阵和边集数组比较好理解和实现 我在网上查...

数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置

//三元组顺序表来存储矩阵并进行矩阵的转置 typedef int Elemtype ; const int MAXSIZE=12500; const int MAXNUM=20; typedef...

关于图的邻接表存储建立方式及深度遍历的个人理解以及数据结构7.22的算法

 采用codeblock编译器 1.头文件:paint.h #ifndef PAINT        ///必须要有才能被其他文件所识别 #define PAINT ...

数据结构(14):图的存储方式(邻接矩阵、邻接表....)

。。。

数据结构的几种存储方式

在计算机中,数据的存储结构可以采用如下四种方法来实现。 1、顺序存储方式:顺序存储方式就是在一块连续的存储区域一个接着一个的存放数据。顺序存储方式把逻辑上相邻的节点存储在物理位置撒花姑娘相邻的存储单...

数据结构 (计算机存储、组织数据方式)

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)