C++算法之二叉树的保存和加载

C++算法之二叉树的保存和加载,第1张

概述C++算法之二叉树的保存加载

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

排序二叉树是我们开发中经常使用到的一种数据结构,它具有较好的插入、删除、查找特性。但是由于二叉树的指针较多,所以相比较其他的数据结构而言,二叉树来得比较麻烦些。但是也不是没有办法,下面介绍一下我个人常用的方法。
我们知道,如果一个二叉树是一个满树的话,那么二叉树的节点应该是按照1、2、3、4依次排开的。但是现实情况是这样的,由于排序二叉树自身的特性,某个 分支节点常常可能左半边有分支,右半边没有分支;或者是右半边有分支,左半边没有分支。那么在数据中节点的顺序很可能是不连贯的了。
但是,对于某一个节点来说,它的左分支节点、右分支节点和父节点之间还是存在着某种联系的。比如说,如果父节点的顺序是n,那么它的左节点只能是n*2, 右边节点只能是2*n+1。那么,我们能不能利用父节点和子节点之间的关系来进行数据的保存呢?答案当然是肯定的。    首先,我们需要对数据结构重新定义一下,其中number记录序列号:
typedef struct _TREE_NODE  {      int data;      int number;      struct _TREE_NODE* left_child;      struct _TREE_NODE* right_child;  }TREE_NODE;  
    那么原来添加数据的函数也要做出修改?
STATUS _insert_node_into_tree(TREE_NODE* pTreeNode,int data)  {      TREE_NODE* pNode;        while(1){          if(data < pTreeNode->data){              if(NulL == pTreeNode->left_child){                  pNode = create_tree_node(data);                  assert(NulL != pNode);                  pNode->number = pTreeNode->number << 1;                  pTreeNode->left_child = pNode;                  break;              }else                  pTreeNode = pTreeNode->left_child;          }else{              if(NulL == pTreeNode->right_child){                  pNode = create_tree_node(data);                  assert(NulL != pNode);                  pNode->number = pTreeNode->number << 1 + 1;                  pTreeNode->right_child = pNode;                  break;              }else                  pTreeNode = pTreeNode->right_child;          }      }        return TRUE;  }    STATUS insert_node_into_tree(TREE_NODE** ppTreeNode,int data)  {      if(NulL == ppTreeNode)          return FALSE;            if(NulL == *ppTreeNode){          *ppTreeNode = (TREE_NODE*)create_tree_node(data);          assert(NulL != *ppTreeNode);          (*ppTreeNode)->number = 1;          return TRUE;      }            return _insert_node_into_tree(*ppTreeNode,data);  }  //该代码片段来自于: http://www.shareJs.com/codes/cpp/6568
    那么,此时保存的时候放在硬盘里面的数据应该有哪些呢?我们在遍历每一个节点的时候,只需要把对应的数据和序列号依次放到硬盘即可。
typedef struct _DATA  {      int data;      int number;  }DATA;    
    保存的数据总要再次启用吧?怎么加载呢?很简单,四个步骤:
        1)根据记录的节点总数分配n*sizeof(TREE_NODE)空间;
        2)依次从硬盘中取出DATA数据,把它们复制给TREE_NODE,暂时left_sIDe和right_sIDe指针为空;
        3)对于对于每一个节点n,寻找它的父节点n>>1,填充left_sIDe或者是right_sIDe,并且根据(n%2)是否为1判断当前节点是左节点还是右节点;
        4)获取n=1的节点,那么这个节点就是我们需要寻找的根节点,至此数据就加载完毕。


以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的C++算法之二叉树的保存和加载全部内容,希望文章能够帮你解决C++算法之二叉树的保存和加载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1232168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存