/******************************************
数据结构:
BST(Binary Search Tree),二叉查找树;性质:
若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
该结点的左、右子树也分别为二叉查找树;遍历:
对于一个已知的二叉查找树,从小到大输出其节点的值;
只需对其进行二叉树的中序遍历即可;
即递归地先输出其左子树,再输出其本身,然后输出其右子树;
遍历的时间复杂度为O(n);查找:
对于一个已知的二叉查找树x;
在其中查找特定的值k,函数Search返回指向值为k的节点指针;
若找不到则返回0,算法时间复杂度为O(h),h为树的高度;
理想情况下时间复杂度为lgn;最大值和最小值:
要查找二叉查找树中具有最小值的元素;
只要从根节点开始,沿着左子树找到最左边的节点就可以了;
反之沿着右子树查找则可以求最大值;插入:
从根节点开始插入;
如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入;
如果要插入的值大于当前节点的值,在当前节点的右子树中插入;
如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空,插入成功;删除:
如果该没有子女,直接删除;
如果该结点只有一个子女,则删除它,将其子女的父亲改为它的父亲;
如果该结点有两个子女,先用其后继替换该节点,其后继的数据一并加在其后;
*******************************************/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;const int N = 100000;
int key[N], l[N], r[N], p[N];
int u, node;int Search(int x, int k)//查询
{if(x == 0 || k == key[x])return x;if(k < key[x])return Search(l[x], k);elsereturn Search(r[x], k);
}int Iterative_Search(int x, int k)//非递归版本的查询
{while(x != 0 && k != key[x])if(k < key[x])x = l[x];elsex = r[x];return x;
}int Minimum(int x)
{while(l[x] != 0)x = l[x];return x;
}int Maximum(int x)
{while(r[x] != 0)x = r[x];return x;
}int Successor(int x)
{if(r[x] != 0)return Minimum(r[x]);int y = p[x];while(y != 0 && x == r[y]){x = y;y = p[y];}return y;
}int Predecessor(int x)
{if(l[x] != 0)return Maximum(l[x]);int y = p[x];while(y != 0 && x == l[y]){x = y;y = p[y];}return y;
}void Insert(int &T, int v)//插入结点
{if(T == 0)key[T = ++node] = v;else if(v <= key[T]){p[l[T]] = T;Insert(l[T], v);}else{p[r[T]] = T;Insert(r[T], v);}
}void Iterative_Insert(int T, int v)//非递归版本插入结点
{int y = 0;int x = T;int z = ++node;key[z] = v;while(x != 0){y = x;if(key[z] < key[x])x = l[x];elsex = r[x];}p[z] = y;if(y == 0)key[T] = z;else if(key[z] < key[y])l[y] = z;elser[y] = z;
}void Transplant(int T, int u, int v)//移植过程;
//把一棵子树u归并到另一棵子树v中,u的父亲变为v的父亲,u的父亲就有了v作为其孩子。
{if(p[u] == 0)T = v;else if(u == l[p[u]])l[p[u]] = v;elser[p[u]] = v;if(v != 0)p[v] = p[u];
}void Delete(int T, int z)//删除结点
{if(l[z] == 0)Transplant(T, z, r[z]);else if(r[z] == 0)Transplant(T, z, l[z]);else{int y = Minimum(r[z]);if(p[y] != z){Transplant(T, y, r[y]);r[y] = r[z];p[r[y]] = y;}Transplant(T, z, y);l[y] = l[z];p[l[y]] = y;}
}int main()
{freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);int n;scanf("%d",&n);for(int i=0; i<n; i++){int k;scanf("%d",&k);Insert(u, k);}Delete(u, Search(u, 1));printf("%d\n",Search(u,2));printf("%d\n",Maximum(u));return 0;
}

数据结构-BST(Binary Search Tree)相关推荐

  1. BST(Binary Search Tree 二叉查找树模版)

    /****************************************** 数据结构: BST(Binary Search Tree),二叉查找树;性质: 若结点的左子树不空,则左子树上所 ...

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

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

  3. 二叉查找树(BST Binary Search Tree)

    二叉查找树的特点是什么? 左子树所有的节点都小于父节点,右子树所有的节点都大于父节点.投影到平面以后,就是一个有序的线性表. 二叉查找树既能够实现快速查找,又能够实现快速插入. 但是二叉查找树有一个问 ...

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

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

  5. BST(binary search tree)类型题目需要用到的头文件binary_tree.h

    下面是二叉搜索树需要用到的头文件binary_tree.h #include <stdio.h>struct BinaryTreeNode{int value;BinaryTreeNode ...

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

    数据结构与算法(C++)– 二叉查找树(Binary Search Tree ) 1.二叉查找树(BST) 定义: 假设二叉树的节点都是不同的数,对于树点的任一节点,它的左子树都小于它,它的右子树都大 ...

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

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

  8. PAT甲级1064 Complete Binary Search Tree (30分):[C++题解]完全二叉搜索树BST

    文章目录 题目分析 题目链接 题目分析 思路: 第一步,构造含有n个结点的完全二叉树:第二步,将n个数值填入,使其满足二叉搜索树的性质. 对于第一步: 完全二叉树用一维数组可以存下,不过从根结点的下标 ...

  9. PAT甲级1043 Is It a Binary Search Tree :[C++题解]判断二叉搜索树BST、给定前序序列和中序序列

    文章目录 题目分析 题目链接 题目分析 二叉搜索树(BST):左子树小于根结点,右子树大于等于根结点. 二叉搜索树的中序遍历一定是有序序列.所谓中序遍历:先访问左子树,再访问根结点,最后访问右子树. ...

最新文章

  1. Python gRPC 安装
  2. Synchronized的实现原理(一)
  3. Scramble String -- LeetCode
  4. 基于Visual Studio2010讲解LINQ读出数据库数据生成XML
  5. JavaScript Cookie的操作
  6. 10电脑睡眠后自动关机怎么回事 win_Win8.1睡眠后自动关机如何解决 Win8.1电脑睡眠时间久了自动关机怎么办...
  7. bzoj 1628 1683: [Usaco2007 Demo]City skyline(模拟)
  8. PAT1137 Final Grading
  9. Linux 命令 -- tar
  10. Seaweedfs安装配置使用及mount挂载
  11. 打卡 day 8 数组
  12. 许三多的 “职业精神”
  13. pdf及word文档的读取 pyPDF2,docx
  14. 盛唐气象:李白的诗与酒
  15. PostgreSQL 技术内幕(二) Greenplum-AO表
  16. Android bug日志/错误收集
  17. 雷达通信 技术《相控阵入门到精通》 视频教程 代码 下载
  18. 喜讯:世界首款阿兹海默老年痴呆症治疗药将上市
  19. Vue引入CreateJS
  20. win10创建Ubuntu16.04子系统,安装常用软件以及图形界面(包括win10远程桌面连接Ubuntu)

热门文章

  1. 微信小程序邀请好友增加积分
  2. Android模拟器genymotion及4.4设备安装
  3. adb命令报错 error: no devices found 的解决办法
  4. MTKl 屏的时钟频率计算
  5. E-puck2机器人系列教程-5.查找使用的USB串行端口
  6. 2019信用卡权益总结之七:生日多倍积分
  7. 3行Python代码达到月入过万案例---起名
  8. ctfshow web入门(信息收集1-20)
  9. 【云驻共创】云原生应用架构之企业核心业务未来架构演进路线及华为云方案
  10. 江苏省专科计算机学校排名2015,2021江苏专科学校排名 最新高职院校排行榜