数据结构与算法(C++)– 二叉查找树(Binary Search Tree )


1、二叉查找树(BST)

定义: 假设二叉树的节点都是不同的数,对于树点的任一节点,它的左子树都小于它,它的右子树都大于它。


2、二叉查找树的操作

插入: 从根节点开始比较,小于节点则往左比较,大于节点则往右比较。

void Insert(BinaryTree * &tree, int data)
{if(NULL == tree){tree = new BinaryTree;tree->data =data;tree->leftChild = NULL;tree->rightChild = NULL;}else if(tree->data > data){Insert(tree->leftChild, data);}else if(tree->data < data){Insert(tree->rightChild, data);}
}

查找最大最小值: 最左边为最小值,最右边为最大值

// 找最小值, 最左边
int findMin(BinaryTree * tree)
{if(NULL == tree)return -1;else if(tree->leftChild == NULL)return tree->data;elsereturn findMin(tree->leftChild);
}// 找最大值,最右边
int findMax(BinaryTree * tree)
{if(NULL == tree)return -1;else if(tree->rightChild == NULL)return tree->data;elsereturn findMax(tree->rightChild);
}

删除:删除完节点后,需要从右子树中查找最小值填补。

void Remove(BinaryTree * &tree, int data)
{if(NULL == tree)return;if(data > tree->data)Remove(tree->rightChild, data);else if(data < tree->data)Remove(tree->leftChild, data);// 如果不符合前两种情况则为=// 如果左右子树都不为空,则选择右子树最小的值填补当前节点并在右子树删除它else if(tree->rightChild && tree->leftChild){tree->data = findMin(tree->rightChild);Remove(tree->rightChild, tree->data);}// 如果左右子树至少有一个为空else{BinaryTree *node = tree;// 左边不为NULL则把指针指向左边,反之tree = (tree->leftChild) ? tree->leftChild : tree->rightChild;delete node;node = NULL;}
}

3、AVL 树

定义: AVL 树是一种带有平衡条件的特殊二叉搜索树,平衡条件是任一节点的左子树和右子树的高度相差不能超过1。空树的高度是-1。

  • AVL树的最大高度大概为1.44log(N + 2) − 1.328,实际只略大于logN。
  • 除了插入和删除,AVL数的各种操作的时间复杂度为O(logN) 。

4、平衡AVL树

当按照BST的方式插入新的节点后,可能使AVL树不平衡,需要进一步的操作来平衡。

单旋转:旋转一次、分为左旋转和右旋转

  • 右旋转:

  • 左旋转

双旋转: 旋转两次、分为左-右旋转和右-左旋转

  • 右-左旋转

  • 左-右旋转

5、B树

定义:
对于大数据量,为了减少对磁盘的访问,设计了M叉查找树,内存只存指示关键字,把数据存在硬盘。5阶B树如下:

M阶B树的特性:

  • M叉树的高度大概为 logM(N)
  • L为树叶的数据项个数

数据结构与算法(C++)– 二叉查找树(Binary Search Tree )相关推荐

  1. 学习数据结构 二叉查找树(binary search tree)

    2019独角兽企业重金招聘Python工程师标准>>> 为学习 LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树(平衡二叉搜索树),我不很熟悉该树,虽然大致知道 ...

  2. 二叉查找树(binary search tree)详解

    二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...

  3. [FreeCodeCamp笔记] Python 数据结构和算法1 二分搜索 Binary Search

    我以前学过数据结构和算法(data structure and algorithms. 现在普遍简称DSA),当时用的Robert Sedgewick的coursera课程.这位大神写的<算法( ...

  4. 数据结构--二叉查找树 Binary Search Tree

    文章目录 1.二叉查找树概念 2.二叉查找树操作 2.1 查找 2.2 插入 2.3 删除 2.4 其他 3. 支持重复数据的二叉查找树 4 有散列表了,还需要二叉查找树? 5 代码实现 1.二叉查找 ...

  5. java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)

    二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建.这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树 ...

  6. 二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree) - (代码、分析)

    目录: 代码: 分析: 代码: BSTree.h #ifndef _BSTREE_H_ #define _BSTREE_H_typedef void BSTree;//定义二叉树类型 typedef ...

  7. binary search tree python_二叉查找树(binary search tree)——python实现

    二叉查找树(binary search tree) 顾名思义二叉查找树中每个节点至多有两个子节点,并且还对存储于每个节点中的关键字值有个小小的要求, 即只要这个节点有左节点或右节点,那么其关键字值总的 ...

  8. 二叉搜索树(Binary Search Tree)(Java实现)

    文章目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  9. 数据结构与算法(八)二分搜索树(Binary Search Tree)

    本文主要包括以下内容: 二分搜索树的基本概念 二分搜索树的基本操作 1. 插入 2. 删除 3. 查询 实现二分搜索树 二分搜索树的不足 二分搜索树的基本概念 二分搜索树(英语:Binary Sear ...

最新文章

  1. CopyOnWriteArrayList源码分析
  2. Ch2r_ood_understanding 本文档为论文限定领域口语对话系统中超出领域话语的对话行为识别的部分实验代码。代码基于Python,需要用到的外部库有: Keras(搭建神经网络) S
  3. sqldeveloper 连接oracle时 ora-12505 错误
  4. 前端学习(3075):vue+element今日头条管理-反馈
  5. IE下单单只设置背景透明度的解决方案
  6. 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务
  7. SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理...
  8. js数组常用方法总结(包括ES6)
  9. INFORMATION_SESSION_VARIABLES feature is disabled问题
  10. (day 24 - 广度优先搜索 )剑指 Offer 32 - I. 从上到下打印二叉树
  11. Java的GUI的学习五(窗体事件)
  12. Atiitt 经济学体系树与知识点概念大总结attilax
  13. 吴恩达机器学习视频笔记——简单知识背景
  14. JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
  15. Java实现八大排序算法
  16. Spring Security 配置
  17. java写一个发红包_Java实现微信发红包
  18. Apache Kafka教程A系列:与Storm整合
  19. android系统源码学习 -- 蓝牙 bluetooth (一) 入门
  20. 吕公奇文——《破窑赋》

热门文章

  1. ssm框架搭建和整合流程
  2. LightOJ - 1179 Josephus Problem(约瑟夫环)
  3. ajax实现二级联动
  4. C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
  5. mybatis 开发环境搭建
  6. 聊一下我们团队的理念
  7. VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]
  8. 【python】xsspider零碎知识点
  9. 部分网站公开数据的汇总(2)
  10. 一些 Google 搜索词