排序二叉树 SortBinaryTree

排序二叉树是比较基本但是重要的算法,它在许多实际编码中都不可缺少,还有不少算法和数据结构都基于此。比如,二叉查找树,平衡二叉树,红黑树等等。

SortBinaryTree的源代码见: https://github.com/duankai/SortBinaryTree/

下面,介绍SortBinaryTree。

1.      SortBinaryTree的节点结构:

struct TREE_NODE_T
{
AnyType * pcData;
TREE_NODE_T<AnyType> * pstParent;
TREE_NODE_T<AnyType> * pstLeftChild;
TREE_NODE_T<AnyType> * pstRightChild;
};

2.      构造函数

SortBinaryTree(int(* cmpFunc)(AnyType * d1, AnyType * d2))
{m_pstRoot         = NULL;m_pstSmallestNode = NULL;m_cmpFunc         = cmpFunc;
};

其中,cmpFunc是AnyData的比较函数。

3.      树的插入

树的插入采用递归的方法,首先寻找插入节点的合适位置,然后插入。

 bool InsertTreeNode(TREE_NODE_T<AnyType> * pstNode, TREE_NODE_T<AnyType> * pstTempRoot){if (!pstNode){return false;}if (NULL != pstTempRoot){if (m_cmpFunc(pstNode->pcData ,pstTempRoot->pcData) > 0){if (NULL != pstTempRoot->pstRightChild){return InsertTreeNode(pstNode, pstTempRoot->pstRightChild);}else{pstTempRoot->pstRightChild = pstNode;pstNode->pstParent = pstTempRoot;}}if (m_cmpFunc(pstNode->pcData ,pstTempRoot->pcData) < 0){if (NULL != pstTempRoot->pstLeftChild){return InsertTreeNode(pstNode, pstTempRoot->pstLeftChild);}else{pstTempRoot->pstLeftChild = pstNode;pstNode->pstParent = pstTempRoot;}}if (m_cmpFunc(pstNode->pcData ,pstTempRoot->pcData) == 0){return false;}}else{m_pstRoot = pstNode;}return true;};

4.      查找

    TREE_NODE_T<AnyType> * SearchNode(void * pvData, TREE_NODE_T<AnyType> * pstRoot){if (NULL == pstRoot || NULL == pvData){return NULL;}if (m_cmpFunc(pstRoot->pcData ,(AnyType *)pvData) == 0){return pstRoot;}else if (m_cmpFunc((AnyType *)pvData, pstRoot->pcData) < 0){return SearchNode(pvData, pstRoot->pstLeftChild);}else if (m_cmpFunc((AnyType *)pvData, pstRoot->pcData) > 0){return SearchNode(pvData, pstRoot->pstRightChild);}else{return NULL;}};

5.      删除最小节点

首先,用中序遍历的方法得到最小的节点,然后删除。

AnyType * DeleteSmallestNode(){GetSmallestNode(m_pstRoot);if (NULL == m_pstSmallestNode){return NULL;}AnyType * pcData = m_pstSmallestNode->pcData;if (m_pstSmallestNode == m_pstRoot){m_pstRoot = m_pstRoot->pstRightChild;}SetPointerThisNull(m_pstSmallestNode);free(m_pstSmallestNode);m_pstSmallestNode = NULL;return pcData;};

6.      析构函数

析构函数先用后续遍历节点,再对其进行删除。

7.      删除节点

删除节点的思路分为以下几种情况。

1)删除的是叶子节点,那么直接删除。

2)删除的节点左(右)子树为空,则用右(左)子树替代要删除的节点。

3)删除的节点左右子树都不为空,则用中序方法寻找此节点的前驱,用前驱替代此节点并删除。

bool DeleteTreeNode(void * pvData){if (NULL == pvData){return false;}TREE_NODE_T<AnyType> * pstTreeNode = SearchNode(pvData, GetRootNode());if (!pstTreeNode){return false;}if (pstTreeNode->pstLeftChild != NULL && pstTreeNode->pstRightChild != NULL){TREE_NODE_T<AnyType> * pstForeNode = GetForeNodeMiddleOrder(pstTreeNode);if (!pstForeNode){return false;}memcpy(pstTreeNode->pcData, pstForeNode->pcData, sizeof(AnyType));SetPointerThisNull(pstForeNode);free(pstForeNode);pstForeNode = NULL;return true;}if (pstTreeNode->pstLeftChild == NULL && pstTreeNode->pstRightChild != NULL){if (m_pstRoot == pstTreeNode){m_pstRoot = pstTreeNode->pstRightChild;pstTreeNode->pstRightChild->pstParent = NULL;}else{if (pstTreeNode == pstTreeNode->pstParent->pstLeftChild){pstTreeNode->pstParent->pstLeftChild = pstTreeNode->pstRightChild;}if (pstTreeNode == pstTreeNode->pstParent->pstRightChild){pstTreeNode->pstParent->pstRightChild = pstTreeNode->pstRightChild;}}}if (pstTreeNode->pstRightChild == NULL && pstTreeNode->pstLeftChild != NULL){if (m_pstRoot == pstTreeNode){m_pstRoot = pstTreeNode->pstLeftChild;pstTreeNode->pstLeftChild->pstParent = NULL;}else{if (pstTreeNode == pstTreeNode->pstParent->pstLeftChild){pstTreeNode->pstParent->pstLeftChild = pstTreeNode->pstLeftChild;}if (pstTreeNode == pstTreeNode->pstParent->pstRightChild){pstTreeNode->pstParent->pstRightChild = pstTreeNode->pstLeftChild;}}}SetPointerThisNull(pstTreeNode);free(pstTreeNode);pstTreeNode = NULL;return true;};

总结:

除了SortBinaryTree提供的以上方法,大家还可以在此基础上进行适合自己项目的针对性扩展。由于做此排序二叉树是在写定时器时用来查找最先到时间的那个定时器,从而避免了对每个定时器进行扫描。因此,SortBinaryTree提供了一个删除最小节点的方法。

后续,将继续开源项目中抽象出的工具代码,请大家关注github上的源代码以及CSDN博客上的讲解。同时,也欢迎各路高手留下您宝贵的意见和建议。

排序二叉树 SortBinaryTree相关推荐

  1. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

  2. 查找(三)——基于平衡二叉树的查找(对排序二叉树的改进)

    基于平衡二叉排序树的查找(AVL树) 这一篇博客里总结一下基于平衡二叉树的查找,为什么会有这种查找呢?平衡二叉树又是什么东西呢?现在就来仔细理解一下! 在基于二叉排序树的查找里,我们可以得到的时间复杂 ...

  3. C++11 智能指针unique_ptr使用 -- 以排序二叉树为例

    http://www.cnblogs.com/fstang/p/3947552.html 用智能指针可以简化内存管理.以树为例,如果用普通指针,通常是在插入新节点时用new,在析构函数中调用delet ...

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

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

  5. 树结构练习——排序二叉树的中序遍历(二叉搜索树)

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...

  6. sdut 2128 树结构练习——排序二叉树(BST)的中序遍历

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  7. 树结构练习——排序二叉树的中序遍历

    树结构练习--排序二叉树的中序遍历 Description 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的 ...

  8. 排序二叉树BST(binary search/sort tree)

    之前介绍说,树这种存储结构,能提高数据的存储,读取效率.所以树的应用就可以体现在排序这一方面,比如有排序二叉树,平衡二叉树,红黑树等.本文介绍排序二叉树. 为啥有排序二叉树(二叉搜索树)的出现?这要从 ...

  9. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正 ...

最新文章

  1. 0-1背包一维数组的执行过程图示
  2. 查看数据库表使用空间大小
  3. 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
  4. mysql 8.0 自定义函数_PHP+Mysql防止SQL注入的方法(life)
  5. netcore开源框架_.NET Core开发精选文章目录,持续更新,欢迎投稿!
  6. javascript中0级DOM和2级DOM事件模型浅析
  7. python中变量的命名和关键字和变量的命名规则
  8. c#扫描图片去黑边(扫描仪去黑边)
  9. python的功能名称_ML获取功能选择后的功能名称SelectPercentile,python
  10. javascript-数据类型的转换
  11. OEA 中 WPF 树型表格虚拟化设计方案
  12. 通过谓词查找第一个元素
  13. AX2009企业门户资料
  14. MarkDown 行首缩进
  15. 雾霾的结构化责任主体
  16. snipaste滚动截图方法_Snipaste——这是我用过最好用的截图贴图工具!
  17. 计算机网络里面ap是什么,网络ap是什么意思
  18. win11的控制面板在哪?
  19. 服务器无线桥接技巧,两个路由器无线桥接完美教程【图】
  20. 计算机软件工作室起名'',半永久工作室名字大全

热门文章

  1. vsftpd的主配置文件是什么linux,vsftpd.conf配置文件详解
  2. python入门基础篇(三)序列切片,列表、元组推导式
  3. mysql 如果存在修改_mysql如存在并发修改可能,一定要注意保证数据一致性
  4. vlc文件服务器局域网,vlc流媒体服务器配置
  5. 【Jmeter篇】Jmeter分布式调度压测部署
  6. P1-0:项目框架搭建
  7. 五大主流浏览器及内核
  8. MacBook创建docker私有仓库docker server gave HTTP response to HTTPS client 问题处理办法
  9. 斯坦福-随机图模型-week4.0_
  10. 简单的Flash GUI工具(Simple Flash GUI Tool)