二叉查找树是   左子节点 <= 根节点 <= 右子节点 的树形结构,其平均时间复杂度:O(log2n)(简单地说搜索方式跟二分法差不多)。

二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。

新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。

先定义二叉树和树节点:

typedef struct BST_node{int data;struct BST_node* left;struct BST_node* right;
}BST_Node;
typedef struct BST{BST_Node* root;size_t size;
};

再给出创建节点和删除的函数:

//定义一个函数用来用传入的数据创建节点
BST_Node* creat(int data){BST_Node* node= (BST_Node*)malloc(sizeof(BST_Node));node->data = data;node->left = NULL;node->right = NULL;return node;
}

//定义一个函数用来删除某个节点void destroy(BST_Node* node){    free(node);}

然后实现二叉查找树的主要部分在于插入、删除操作该如何实现。

首先来看插入:

要插入一个数据,同时保持树的特性不改变。这里根据要插入的数据与根节点数据的大小关系来选择插入左子树还是右子树,当根节点为空节点时就放到根节点中;

//该函数用来向以root为根的子树中插入node节点
void insert(BST_Node*  node,  BST_Node** root){//这里用二级指针的目的在于直接修改root为根的子树,函数体中对源节点的修改要用一级指针的形式(二级解引用)if(!*root)*root = node;else if( node->data < (*root)->data)insert(node,  &(*root)->left);//要插入左子树时可以看成向左子节点为根的二叉树中插入node,于是递归调用,这个递归终止条件就是*root为空,也就是说当找到某一路径的最底层子节点的子节点时插入;          //查找树的特性通过if()中的判断选择来维持;elseinsert( node,  &(*root)->right);
}
//插入函数
void bst_insert(BST* bstree, int data){insert( creat(data), &bstree->root);++size;
}

插入ok,再来删除:

//先定义一个函数用来返回在以root为根节点的子树中,查找到数据data的节点,然后如下图所示:
//           1
//          / \
//         0   3   ->例如,要删除3,找到3的节点,然后将节点3的左子树挪到3的右子树的最左下
//            / \       (也就是把2插入到3的右子树,当然结果肯定是在右子树的最左下)
//           2   4      (删除的调整方法有两种)
//          / \  / \

BST_Node*  tofind(int data, BST_Node** root){if((*root)->data == data || !*root)return root;if(data < (*root)->data)tofind(data, &(*root)->left);if(data > (*root)->data)tofind(data, &(*root)->right);
}bool delete(int data,BST* bstree){BST_Node** node = tofind(data, &(bstree->root));if(*node){insert((*node)->left, (*node)->right);BST_Node* node_tmp = *node;*node = (*node)->right;destroy(node_tmp);--size;return true;}elsereturn false;
}

删除ok,其他的功能可以在插入、删除的功能上扩展出来,不重复了。

转载于:https://www.cnblogs.com/young8848/p/4382592.html

二叉查找树的简单实现相关推荐

  1. 【转】数据结构与算法(上)

    数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误 ...

  2. hashmap为什么用红黑树_要看HashMap源码,先来看看它的设计思想

    HashMap 是日常开发中,用的最多的集合类之一,也是面试中经常被问到的 Java 类之一.同时,HashMap 在实现方式上面又有十分典型的范例.不管是从哪一方面来看,学习 HashMap 都可以 ...

  3. hashmap containsvalue时间复杂度_不看看HashMap源码,怎么和面试官谈薪资

    HashMap 是日常开发中,用的最多的集合类之一,也是面试中经常被问到的 Java 类之一.同时,HashMap 在实现方式上面又有十分典型的范例.不管是从哪一方面来看,学习 HashMap 都可以 ...

  4. Java源码HashMap、ConcurrentHashMap:JDK1.8HashMap静态常量以及设置的目的,初始容量、最大容量、扩容缩容树化条件

    HashMap核心源码 作为工作中最重要.最常用的容器之一,当然还是要自己动手写一篇 HashMap 的源码解析来加深对其的印象咯,而且它的设计与实现 也有很多值得学习的地方. 以下包含HashMap ...

  5. 【数据结构与算法图文动画详解】终于可以彻底弄懂:红黑树、B-树、B+树、B*树、满二叉树、完全二叉树、平衡二叉树、二叉搜索树...

    1.树简介 1.1基本概念 树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构.没有结点的树称为空(null或empty)树.一棵非空的树包括一个根结点,还(很可能)有多个附加 ...

  6. 面试题总结:HashMap实现原理

    文章目录 1.简单了解: 2.HashMap实现原理详解: 3.红黑树是一种自平衡二叉查找树 1.简单了解: JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链 ...

  7. java详细学习路线及路线图

    本文将告诉你学习Java的一些步骤,学习过程中可能遇到的问题,及学习路线.希望能够对你的学习有所帮助. 一.Java基础 二.Java学习七大阶段 阶段1.JavaSE基础 阶段2.WEB前端 阶段3 ...

  8. 算法与数据结构 (三) 二叉树的简单应用 二叉查找树,二叉堆排序

    一  二叉查找树 二叉查找树又叫二叉排序树,是为了解决查找的效率问题.正常情况下查找一个元素,需要O(n)的代价,但是如果查找元素有顺序,有序数组:可以用二分查找降低到 lgn 代价,但是有序链表的代 ...

  9. 简单的指针二叉查找树和数组二叉查找树

    //指针的二叉查找树 //插入比较简单所以就没做了 //删除太麻烦等有空再做 #include<iostream> using namespace std; template<typ ...

最新文章

  1. Jmeter(二十九)_dotnet搭建本地接口服务
  2. 记一次内存溢出的分析经历
  3. ng-init,ng-controller,ng-model
  4. 游戏开发概要策划书的内容
  5. 利用向量叉积求三角形的面积(+STL:nth_element求第K大的数)
  6. 【渝粤教育】国家开放大学2018年春季 8634-21TAndroid智能手机编程 参考试题
  7. linux 防火墙 ftp,RedHat6 建立基于防火墙和SELinux的虚拟用户vsFTP
  8. 【BZOJ2229】【ZJOI2011】最小割
  9. debug最常用的快捷键
  10. oracle表空间总结,Oracle操作用户和表空间的总结
  11. React Native屏幕尺寸适配
  12. ios动态创建类Class
  13. 动手学深度学习(第六章 循环神经网络)
  14. vue antd的menu组件使用
  15. ienumerable vs iqueryable异常
  16. adb发送什么命令能在手机屏幕弹窗显示_Android 手机投屏在 Ubuntu 上的方法
  17. matlab绘图修改字体大小,matlab绘图中设置字体及图片大小
  18. android之animator 和animation 的区别
  19. python 3.0 实现多级反馈队列进程调度算法
  20. PowerShell_8_零基础自学课程_8_高级主题:WMI对象和COM组件

热门文章

  1. 这21 个刁钻的HashMap 面试题,我把阿里面试官吊打了!
  2. 面试必问:CPU 占用高,如何一击即中!
  3. 面试问烂的 Spring MVC 过程
  4. 人工智能是如何应用于智能交通领域
  5. Java线程详解(7)-线程的调度
  6. Docker实战:Docker安装部署RabbitMQ
  7. 通过MyBatis查找一张表的数据,某些字段的值为空
  8. JS对象与Dom对象与jQuery对象之间的区别
  9. easyui datagrid 多表头数据错位_表格数据检索(二)
  10. @autowired注解原理_SpringBoot注解大全,收藏一波!!!