【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

排序二叉树是我们开发中经常使用到的一种数据结构,它具有较好的插入、删除、查找特性。但是由于二叉树的指针较多,所以相比较其他的数据结构而言,二叉树来得比较麻烦些。但是也不是没有办法,下面介绍一下我个人常用的方法。
    我们知道,如果一个二叉树是一个满树的话,那么二叉树的节点应该是按照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;}elsepTreeNode = 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;}elsepTreeNode = 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);
}

那么,此时保存的时候放在硬盘里面的数据应该有哪些呢?我们在遍历每一个节点的时候,只需要把对应的数据和序列号依次放到硬盘即可。

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的节点,那么这个节点就是我们需要寻找的根节点,至此数据就加载完毕。

一步一步写算法(之排序二叉树的保存和加载)相关推荐

  1. 机器学习算法------2.11 模型的保存和加载(joblib.dump()、joblib.load())

    #  模型保存 joblib.dump(estimator, "./data/test.pkl") # 模型加载 estimator = joblib.load("./d ...

  2. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...

    归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...

  3. 一步一图一代码之排序二叉树

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所 ...

  4. 一步一步写算法(之二叉树深度遍历)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 深度遍历是软件开发中经常遇到的遍历方法.常用的遍历方法主要有下面三种:(1)前序遍历:(2)中 ...

  5. 一步一步写算法(之图的保存)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面的几篇博客,我们对图进行基本定义,同时介绍了图的创建.图的添加和删除等.今天,我们聊一聊图 ...

  6. 一步一步写算法(之二叉树广度遍历)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在二叉树的遍历当中,有一种遍历方法是不常见的,那就是广度遍历.和其他三种遍历方法不同,二叉树的 ...

  7. 机器学习-分类算法-模型的保存和加载12

    保存模型 from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression,SGDR ...

  8. 一步一步写算法(之 算法总结)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...

  9. 一步一步写算法(之 算法总结)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍 ...

最新文章

  1. 如何配置FastReport.Net环境
  2. 零基础入门学习Python(18)-全局变量与局部变量
  3. -----IT男生涯————初始篇
  4. springcloud-05-ribbon中不使用eureka
  5. div+css使多行文字垂直居中?
  6. 微服务架构的优缺点_微服务架构DNS服务注册与发现实现原理
  7. mysql row 格式binlog 恢复_为什么要把MySQL的binlog格式修改为row
  8. 【原】执行nosetests 报错:pkg_resources.DistributionNotFound: nose==0.10.4
  9. Java中的四种内部类
  10. 【转】Sobel 算子
  11. 算法学习笔记(5) 传递闭包
  12. AngularJS停止定时器$interval
  13. udal导mysql_MySQL性能测试工具之mysqlslap
  14. 用python创建微信机器人_手把手教你用Python创建微信机器人
  15. redis数据库(一)
  16. 毕业设计游戏类网站设计静态页面基于html,div+css+jquery(含源码)
  17. html响应式布局ipad,响应式布局(Responsive design)
  18. 计算机设计大赛应用软件组,组一览表(计算机设计大赛).pdf
  19. nnunet入门之一 (CT图像分割)
  20. Ubuntu20.04 添加右键新建文件

热门文章

  1. 第二届大数据世界论坛 聚焦行业需求
  2. IIS 部署WCF时遇到这么个错:
  3. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法
  4. 修改SR4000自带软件,支持opencv
  5. c# 多个RadioButton与DataTable的数据绑定
  6. flex builder method
  7. jqGrid获取一行数据的方法
  8. 为什么阿里Java规约要求谨慎使用SimpleDateFormat
  9. leetcode-6-Z字形变换
  10. Java设计模式总汇二---MVC、中介者设计模式