BST是一类用途极广的数据结构。它有如下性质:设x是二叉搜索树内的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。

BST容易出现不平衡的情况,所以实际运用的时候还是以平衡的二叉搜索树为主,例如RB树,AVL树,treap树甚至skiplist等。

BST实现较为简单,我们直接来看看代码吧。

代码如下:(仅供参考)

 #include <iostream>
using namespace std; struct Node {
int key;
Node * left;
Node * right;
Node * parent;
Node() : key(), left(nullptr), right(nullptr), parent(nullptr) {}
}; class BST {
Node * root;
private :
Node * minimum(Node * p);
Node * maximum(Node * p);
//用新结点代替旧结点,只修改结点与其父节点的指向,允许新结点为空
void transplant(Node * old_t, Node * new_t);
public :
BST() : root(nullptr) {}
Node * search(const int k) {return search(root, k);}
Node * search(Node * p, const int k);
const Node * minimum() {return minimum(root);}
const Node * maximum() {return maximum(root);}
const Node * successor(Node * p);
const Node * predecessor(Node * p);
void insert(const int k);
void remove(const int k) {remove(search(k));}
void remove(Node * p);
void inorderWalk() {inorderWalk(root);}
void inorderWalk(Node * p);
}; Node * BST::search(Node * p, const int k) {
if (p == nullptr || k == p->key)
return p;
if (k < p->key)
return search(p->left, k);
else
return search(p->right, k);
} Node * BST::minimum(Node * p) {
if (p == nullptr)
return p;
while (p->left)
p = p->left;
return p;
} Node * BST::maximum(Node * p) {
if (p == nullptr)
return p;
while (p->right)
p = p->right;
return p;
} const Node * BST::successor(Node * p) {
if (p->right)
return minimum(p->right);
Node * y = p->parent;
while (y != nullptr && y->right == p) {
p = y;
y = y->parent;
}
return y;
} const Node * BST::predecessor(Node * p) {
if (p->left)
return maximum(p->left);
Node * y = p->parent;
while (y != nullptr && y->left == p) {
p = y;
y = y->parent;
}
return y;
} void BST::insert(const int k) {
Node * p = new Node;
p->key = k; Node *x = root, *y = nullptr;
while (x != nullptr) {
y = x;
if (x->key < k)
x = x->right;
else
x = x->left;
}
p->parent = y;
if (y == nullptr)
root = p;
else if (y->key < k)
y->right = p;
else
y->left = p;
} void BST::transplant(Node * old_t, Node * new_t) {
if (old_t->parent == nullptr)
root = new_t;
else if (old_t == old_t->parent->left)
old_t->parent->left = new_t;
else
old_t->parent->right = new_t;
if (new_t != nullptr)
new_t->parent = old_t->parent;
} void BST::remove(Node * p) {
if (p->left == nullptr)
transplant(p, p->right);
else if (p->right == nullptr)
transplant(p, p->left);
else {
Node * t = minimum(p->right);
if (t->parent != p) {
transplant(t, t->right);
t->right = p->right;
t->right->parent = t;
}
transplant(p, t);
t->left = p->left;
t->left->parent = t;
}
delete p;
} void BST::inorderWalk(Node * p) {
if (p) {
inorderWalk(p->left);
cout << p->key << ends;
inorderWalk(p->right);
}
}

BinarySearchTree(二叉搜索树)原理及C++代码实现的更多相关文章

  1. java二叉搜索树原理与实现

    计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...

  2. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  3. AVL平衡二叉搜索树原理及各项操作编程实现

    C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...

  4. BinarySearchTree二叉搜索树的实现

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

  5. C++ 二叉搜索树原理及其实现

    首先是概念:二叉搜索树又称二叉排序树,它具有以下的性质: 若是左子树不为空,则左子树上所有节点的值小于根节点的值 若是右子树不为空,则右子树上所有结点的值大于根节点的值 二叉搜索树的左右子树也是二叉搜 ...

  6. 【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)

    #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Positio ...

  7. 二叉搜索树详解(Java实现)

    1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...

  8. JS递归及二叉搜索树的移除节点

    1递归含义:在某时某刻某个条件下调用包含自己的函数 2:注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环: 死循环eg: function f(someP){ f(somP); } f(4); ...

  9. 编程算法 - 二叉搜索树 与 双向链表 代码(C++)

    二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...

随机推荐

  1. Maven - web 实例

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  2. Apache Spark:来自Facebook的60 TB +生产用例

    本文主要讲Facebook扩展spark替换hive的过程中积累的经验和教训. 浪尖整理翻译https://databricks.com/blog/2016/08/31/apache-spark-sc ...

  3. 桥接 brctl

    把eth0和wlan0桥接在一起 作用:测试wlan0网卡的并发性能   两个网卡桥接后把linux主机模拟成一个“无线路由交换机” Vi   br0.sh #!/bin/bash ifconfig ...

  4. ubuntu root用户下找不到环境变量解决办法

    打开 gedit /root/.bashrc   ,在文件的末尾添加: source /etc/profile 然后执行更新:source /root/.bashrc

  5. nodejs(10)express路由

    后端路由 前端请求的URL地址,都要对应一个后端的处理函数,那么 这种URL地址到 处理函数之间的对应关系,就叫做后端路由: 在Express中,路由的主要职责 就是 把客户端的请求,分发到对应的处理 ...

  6. Freemarker的一点延生

    1.freemarker一般不是单独使用,他可以和activeMQ互相结合,来完成功能的. 使用它有 几点好处, 首先就是提高程序效率,一般情况我们的页面都是jsp,而jsp实际上是servlet,在 ...

  7. DP模板

    怕不是最后一篇(雾),过滤最基础的背包DP.状压DP.递推等 树上换根DP:https://www.luogu.org/problemnew/show/P4284 #include<bits/s ...

  8. eclipse环境配置,字体大小,代码智能提示,JSP页面默认字符集修改

    安装好JDK后,下载Java EE解压版eclipse 1.字体大小 Windows——>Preferences——>General——>Appearance——>Colors ...

  9. 深入分析Java反射(二)-数组和枚举

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  10. Git&GitHub 基本使用

    如果是Windows用户需要自行去Git的官网下载Git工具 相信以您的聪明才知不需要一会就可以安装好Git工具了 博主这里是MacOS系统,本省就自带Git工具就不演示安装了 在完成一个简单的Git ...