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. [题解] CF438E The Child and Binary Tree

    CF438E The Child and Binary Tree Description 给一个大小为\(n\)的序列\(C\),保证\(C\)中每个元素各不相同,现在你要统计点权全在\(C\)中,且 ...

  2. 实验吧web-中-简单的sql注入

    页面显示:到底过滤了什么东西? 所以我们先试试到底是过滤了什么 1 显示正常 1' 不正常 (直接输入的关键字均会被过滤) 1 union select 显示:1 select 1 union sel ...

  3. aced六类股票问题

    一.状态转移框架 在我们刷题的过程中,很多同学肯定会遇到股票问题这类题目,股票问题有很多种类型,大多数同学都知道要用动态规划去做,但是往往写不对状态转移方程,我刚接触这类问题时也是一头雾水,但是掌握了 ...

  4. python 进程和线程(2)

    这篇博客是按照博客<进程和线程(1)>中内容用futures改写  with futures.ProcessPoolExecutor() as executor:可以两篇博客对照看. 2改 ...

  5. C语言笔记 15_标准库&locale&math&setjmp&signal&stdarg&stddef

    <locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数. ...

  6. C# 创建Windows服务。服务功能:定时操作数据库

      一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.T ...

  7. UML-基于GRASP对象设计步骤

    在OO设计建模的时候,在最后考虑系统启动时需要初始化的内容. 1.从用例开始,以下是一步步设计用例实现 处理销售 2.SSD 我们选择: makeNewSale 3.编写操作契约(复杂用例场景时) 4 ...

  8. ODBC、OLEDB和ADO之间的关系 ,以及性能比较

    学习了.net视频之后,对里面涉及到的数据库连接部分中的一些概念表示很无语.网上很多相关资料,但除了网站不一样外,基本上内容都神一样的一致. 现在,我就通过结合看到的一些资料再加上自己的理解试图去解释 ...

  9. goweb-模板引擎

    模板引擎 Go 为我们提供了 text/template 库和 html/template 库这两个模板引擎,模板引 擎通过将数据和模板组合在一起生成最终的 HTML,而处理器负责调用模板引擎并将引 ...

  10. RepeatSubmitInterceptor extends HandlerInterceptorAdapter

    package com.ruoyi.framework.interceptor; import java.lang.reflect.Method; import javax.servlet.http. ...