#include <stdio.h>
#include <stdlib.h>typedef struct node {int data;struct node* left;struct node* right;
} Node;typedef struct {Node* root;
} Tree;void insert(Tree* tree, int value) {//二叉搜索树插入 非递归Node* node = (Node* )malloc(sizeof(Node));node -> data = value;node -> left = NULL;node -> right = NULL;if (tree -> root == NULL) {tree -> root = node;}else {Node* temp = tree -> root;while (temp != NULL) {if (value < temp -> data) {if (temp -> left == NULL) {temp -> left = node;return;}else {temp = temp -> left;}}else if (value > temp -> data) {if (temp -> right == NULL) {temp -> right = node;return;}else {temp = temp -> right;}}else {return;}}}
}bool search(Tree* tree, int value) {//二叉搜索树查询 非递归Node* temp = tree -> root;while (temp != NULL) {if (temp -> data == value) {return true;}else if (value < temp -> data) {temp = temp -> left;}else {temp = temp -> right;}}return false;
}void preorder(Node* node) {//前序遍历 递归if (node != NULL) {printf("%d", node -> data);preorder(node -> left);preorder(node -> right);}
}void inorder(Node* node) {//中序遍历 递归if (node != NULL) {inorder(node -> left);printf("%d", node -> data);inorder(node -> right);}
}void postorder(Node *node) {//后序遍历 递归if (node != NULL) {postorder(node -> left);postorder(node -> right);printf("%d", node -> data);}
}int get_height(Node* node) {//获取树的高度 递归if (node == NULL) {return 0;}int left_h = get_height(node -> left);int right_h = get_height(node -> right);return (left_h > right_h ? left_h : right_h) + 1;
}int get_max(Node* node) {//普通二叉树查找最大值 递归if (node == NULL) {return -999999;}else {int m1 = get_max(node -> left);int m2 = get_max(node -> right);int m3 = node -> data;int max = m1;if (m2 > max) { max = m2; }if (m3 > max) { max = m3; }return max;}
}int get_min(Node* node) {//普通二叉树查找最小值 递归if (node == NULL) {return 9999999;}else {int m1 = get_min(node -> left);int m2 = get_min(node -> right);int m3 = node -> data;int min = m1;if (m2 < min) { min = m2; }if (m3 < min) { min = m3; }return min;}
}int BST_get_min(Node* node) {//二叉搜索树查找最小值 递归if (node == NULL) {return -1;}else if (node -> left == NULL) {return node -> data;}return BST_get_min(node -> left);
}int BST_get_max(Node* node) {//二叉搜索树查找最大值 递归if (node == NULL) {return -1;}else if (node -> right == NULL) {return node -> data;}return BST_get_max(node -> right);
}bool BST_delete(Tree* tree, int value) {//二叉搜索树删除 非递归if (tree -> root == NULL) {return false;}Node* parents = NULL;Node* cur = tree -> root;Node* del = cur;while (cur != NULL && cur -> data != value) {if (value < cur -> data) {parents = cur;cur = cur -> left;}else if (value > cur -> data) {parents = cur;cur = cur -> right;}}if (cur == NULL) {return false;}if (cur -> left == NULL) {if (cur == tree -> root) {tree -> root = cur -> right;}else if (cur = parents -> left) {parents -> left = cur -> right;}else {parents -> right = cur -> right;}del = cur;}if (cur -> right == NULL) {//只有左孩子if (cur == tree -> root) {tree -> root = cur -> left;}else if (parents -> left == cur) {parents -> left = cur -> left;}else {parents -> right = cur -> left;}del = cur;}else {//有左右孩子Node* rights_left = cur -> right;parents = cur;while (rights_left -> left != NULL) {//找到右子树最左,没想到比rights_left更好的词来表示parents = rights_left;rights_left = rights_left -> left;}del = rights_left;cur -> data = rights_left -> data;//交换节点的值if (parents -> left == rights_left) {//排除右边第一个节点的左子树为空的情况parents -> left = rights_left -> right;}else {parents -> right = rights_left ->right;}}free(del);
}int main(int argc, char **argv) {int arr[7] = {6, 3, 8, 2, 5, 1, 7};Tree tree;tree.root = NULL;for (int i=0; i<7; i++) {insert(&tree, arr[i]);}insert(&tree, 4);inorder(tree.root);BST_delete(&tree, 4);printf("\n");inorder(tree.root);return 0;
}

数据结构:二叉搜索树(BST)全部基本操作相关推荐

  1. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  2. 23王道数据结构二叉搜索树(BST)算法题(6-11题)总结(伪代码)

    6.判断给定的二叉树是否是二叉排序树 算法思想:中序遍历,一棵树为二叉排序树即左右子树为二叉排序树,且当前根节点和左右子树呈递增序列,对左右子树也是如此判断,显然是个递归过程              ...

  3. 【数据结构与算法】3.二叉搜索树(BST)、c++代码

    二叉搜索树(BST).c++代码 参考 https://blog.csdn.net/c_living/article/details/81021510

  4. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  5. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  6. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  7. 二叉搜索树BST的学习

    文章目录 二叉搜索树BST 什么是BST? 用BST做什么? 一.BST的特性 BST的特性是什么? 1.[230. 二叉搜索树中第K小的元素](https://leetcode.cn/problem ...

  8. 二叉搜索树(BST)详解

    数据结构:二叉搜索树(BST) 今天咱们来聊聊二叉搜索树,先从字面上来理解,二叉,指的是有两个分支,左子树和右子树:搜索树,啥意思呢,搜索,是不是就是之前学过dfs和bfs那边学过,对啊,dfs就是深 ...

  9. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  10. 二叉搜索树 (BST)

    二叉搜索树 (BST : Binary Search Tree) 又名 二叉查找树 或 二叉排序树. 二叉搜索树: 左孩子的值 一定小于或等于 父结点的值 二叉搜索树: 右孩子的值 一定大于或等于 父 ...

最新文章

  1. Cell子刊:根瘤菌微生物群落的模块化特征及其与共生根瘤菌的进化关系
  2. 决策树ID3和C4.5算法Python实现源码
  3. 关于软件组织培训的几个值得提倡的建议
  4. jfreechart demo 源代码 下载
  5. 大数据学习(09)--Hadoop2.0介绍
  6. 乐山市计算机学校的董事长是,乐山市计算机学校干部主题教育
  7. 人工智障学习笔记——深度学习(2)卷积神经网络
  8. cacti linux cpu datasource,Cacti 0.8.8b 硬盘、网络流量、cpu、内存告警配置
  9. mysql的压缩包,mysql 压缩包安装
  10. python画图程序没有图_Python实现画图软件功能方法详解
  11. Gps经纬度转化关系
  12. 【电脑讲解】压缩包的使用技巧
  13. ffmpeg实现视频马赛克特效
  14. <Java>设计一个名为Fan的类
  15. chartengine 图表的应用流程
  16. 计算机英语与普通英语,计算机英语和普通英语有什莫不同? – 手机爱问
  17. [Eigen中文文档] 切片和索引
  18. 嫁人就嫁程序猿:不说话则已,开口就是段子手
  19. 2016年8月20日 星期六 --出埃及记 Exodus 16:21
  20. Taro 兼容 h5 踩坑指南

热门文章

  1. 法拉利杀手Koenigsegg CCX
  2. [转载] python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
  3. Python 基础课程第五天
  4. Java学习目录(持续更新中)
  5. Django基础--4
  6. 类型与通用语言运行时:System.Object
  7. mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
  8. ASP.NET Report Starter Kit视频教程--1
  9. A deep learning model integrating FCNNs and CRFs for brain tumor segmentation
  10. 二相四线制步进电机驱动原理与Proteus仿真