博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法踩坑6-二叉搜索树排序
阅读量:5990 次
发布时间:2019-06-20

本文共 1378 字,大约阅读时间需要 4 分钟。

hot3.png

背景

接上面五篇文章

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

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

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

二叉搜索树排序思想

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

因为只要遍历一遍二叉搜索树就能得到排序的序列,所有时间复杂度为O(N)。

二叉搜索树排序实现

二叉搜索树的插入

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

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
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

你可能感兴趣的文章
史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)...
查看>>
每日记录 2016-4-28
查看>>
iphone-common-codes-ccteam源代码 CCUITableView.h
查看>>
iOS 通过代码关闭应用程序
查看>>
Educational Codeforces Round 55 (Rated for Div. 2)
查看>>
翻译-高效的CSS
查看>>
数据库维护脚本
查看>>
linux不识别NTFS移动硬盘USB
查看>>
如何准确输出PWM脉冲个数的方法
查看>>
Android手机无线adb
查看>>
双指针算法
查看>>
Docker 镜像构建的时候,应该小心的坑
查看>>
html--添加、删除滚动条
查看>>
&&和&、||和|的区别
查看>>
keil集成开发环境下,编译stm32f103的工程,bug总结
查看>>
时间管理答案
查看>>
CentOS7.6使用yum安装MySQL8.0
查看>>
灰度图像亮度对比度调整的简单代码
查看>>
iPhone5终于出现了
查看>>
15.scrapy中selenium的应用
查看>>