2019独角兽企业重金招聘Python工程师标准>>>

背景

接上面五篇文章
算法踩坑-快速排序
算法踩坑2-插入排序
算法踩坑3-堆排序
算法踩坑4-冒泡排序
算法踩坑5-归并排序

来继续聊聊最近我写的一些算法的小例程,这次要聊的是使用二叉搜索树实现的排序,是一个时间复杂度O(N)的算法。

主要从以下几方面来说的:

  • 二叉搜索树排序思想
  • 二叉搜索树排序实现

二叉搜索树排序思想

二叉搜索树的排序能够达到时间复杂度O(N)的前提是序列的数据结构需要是二叉搜索树,二叉搜索树的结构是每个非叶子节点最多有2个孩子节点,并且对于任一个节点,左孩子节点的关键字小于父父节点的关键字,右孩子节点的关键字大于父节点的关键字,因此使用中序遍历的方式(左子树->父节点->右子树)可以得到一个从小到大的有序序列。
因为只要遍历一遍二叉搜索树就能得到排序的序列,所有时间复杂度为O(N)。

二叉搜索树排序实现

二叉搜索树的插入

二叉搜索树核心的地方就在于节点的插入,使用递归的方式插入新的节点,需要注意的地方在于新的节点的插入需要返回改节点的指针,然后把某个节点的左孩子指针或者是右孩子的指针指向新创建的节点
Tree_Insert

SearchTree Tree_Insert(ElementType Element, SearchTree T) {if (NULL == T) {T = malloc(sizeof(struct TreeNode));T->Element = Element;T->Count = 1;// 左右子树置为空T->Left = T->Right = NULL;} else if (Element < T->Element) {T->Left = Tree_Insert(Element, T->Left);} else if (Element > T->Element) {T->Right = Tree_Insert(Element, T->Right);} else {T->Count ++;}// 返回最终插入的位置return T;
}

二叉搜索树的中序遍历

二叉搜索树的节点中保存Count信息用于处理重复数据的个数信息,这种做法用于节点的关键字的数据是简单的数据类型,而不是某个复杂数据类型的其中某个关键字,如果用于排序的关键字是某个复杂数据类型的某个关键字,需要使用额外的空间来保存源数据的数据信息。

// Left->Middle->Right 中序遍历
void Tree_LMR_Travel(SearchTree T) {if (NULL == T) {return;}if(NULL != T->Left) Tree_LMR_Travel(T->Left);int i;for (i= 0; i<T->Count; i++) {printf("%d ", T->Element);}if(NULL != T->Right) Tree_LMR_Travel(T->Right);
}

One More Thing

噢!我是算法,点我

转载于:https://my.oschina.net/FEEDFACF/blog/1570424

算法踩坑6-二叉搜索树排序相关推荐

  1. leetcode算法题--不同的二叉搜索树

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...

  2. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

  3. 算法:最优二叉搜索树

    算法设计第五次作业part2 1.纸面题:对最优二叉树和矩阵连乘两种算法验证四边形法则,如果符合四边形法则则举几个正例,如果不符合则举几个反例 四边形法则 i<i'j<j'w(i,j)+w ...

  4. 算法实验 最优二叉搜索树

    最优二叉搜索树 最优二叉搜索树 问题描述 问题分析 代码 问题描述 二叉搜索树我们都知道,左子树结点的值都小于根结点,右子树结点的值都大于根节点.如果某个结点没有左子树或右子树,那么在对应的位置上加一 ...

  5. leetcode算法题--不同的二叉搜索树 II

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 此题的思路是对所有n为根节点情况进行遍历,然后对其左右子树进行 ...

  6. 红黑树算法原理(从二叉搜索树讲起)

    原文:红黑树深入剖析及Java实现,本文修改了原文的一些小错误,如果想看红黑树的Java实现可以到原文去看. 红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST ...

  7. 后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...

    二叉搜索树BST定义: 基于广义二叉树,一颗二叉树定义:或者为空 或者包含三部分:一个值,一个左分支和一个右分支.这两个分支也都是二叉树分支.一颗二叉搜索树是满足下面条件的二叉树:所有左分支的值都小于 ...

  8. 二叉搜索树——插入、查找、删除

    二叉搜索树 二叉搜索树的特点 根节点的值大于左结点的值,小于右结点的值 根节点的左.右子树也是一个二叉搜索树 没有重复值 中序遍历得到的序列是从小到大排列的 二叉树的存储结构 typedef stru ...

  9. C++实现二叉搜索树的查找(附完整源码)

    二叉搜索树的查找 二叉搜索树的查找算法 二叉搜索树的查找算法完整源码 二叉搜索树的查找算法 在二叉搜索树 b 中查找 x 的过程为: 若 b 是空树,则搜索失败,否则: 若 x 等于 b 的根节点的数 ...

最新文章

  1. openresty配置部署
  2. 《剑指Offer》60:n个骰子的点数
  3. 公路交通安全设施设计细则_转让江苏公路交通工程(公路安全设施分项)二级资质(包安许)...
  4. concat() “+“ 和 append() 的区别
  5. kafka1.0+ 集群搭建
  6. OpenShift 4 之 Image Registry、Image 和 ImageStream 概念和相关操作
  7. 明年Wi-Fi手机销量5亿 无线技术助移动互联网爆发
  8. SEO优化之——html页面相关总结
  9. C#经典面试题及答案 (3)
  10. LeetCode Array 最长回文子串-数组和string题目
  11. Modbus 与 RS485 的区别与联系
  12. 通过cmd进行文件格式的转换
  13. vue实现一个简单的表情包组件
  14. C盘无损扩容 win10(亲测,良心,有用)
  15. 固体物理 2022.9.27
  16. C# GDI 手绘图片转化为电子版处理
  17. msrcr(Multi-Scale Retinex with Color Restoration) 带色彩恢复的多尺度视网膜增强算法 整理
  18. NASA授予下一代航天计算处理器合同,中国情况如何?
  19. 解答:什么样的企业才适合引入OA办公系统?
  20. RecyclerView中播放视频

热门文章

  1. 2020计算机考研初试考试先后顺序,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  2. 怎么传日期参数_时间序列amp;日期学习笔记大全(下)
  3. ubuntu字符界面login_Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法...
  4. python扫描端口脚本_Python端口扫描简单程序
  5. python实现冒泡排序视频_Python实现冒泡排序算法的完整实例
  6. oracle 数据库日常巡检:数据库基本状况、oracle资源使用、数据备份结果、性能、cpu等、数据安全、归档日志、会话、SGA/PGA使用情况
  7. pygame判断鼠标左键_美商海盗船DarkCoreRGB Pro SE无线电竞鼠标评测
  8. 浙大计算机知识基础,计算机基础知识题浙大远程
  9. 扫地机器人湿地_口碑最好,用户认可度最高,浦桑尼克新款扫地机M7 MAX上手体验...
  10. Zabbix的分布式监控部署