【模板】二叉搜索树

二叉搜索树:对于二叉树中的任意节点,左子树中所有的值都小于当前位置的值,右子树中所有的值都大于当前位置的值。

操作:

1.插入一个数值。

2.查询是否包含某个数值。

3.删除某个数值。

插入和查找是差不多的,都是比当前值(要找的值)大就往左走,否则就往右走,直到找到为止。

最复杂的操作是删除某个节点,不过可以分为3种情况来讨论:

1.需要删除的节点没有左子树,那就把右子树提上去。

2.需要删除的节点的左子树没有右子树,那就把左子树提上去。

3.其他情况,把左子树中最大的节点提到当前删除的节点的位置。

所有操作的时间复杂度都是O(log(n))。

还是比较高效的一种数据结构。

代码:

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <math.h>
#include <queue>
using namespace std;
typedef long long ll;
#define INF 2147483647

//表示节点的结构体
struct node{
    int val;
    node *lch, *rch;
};

//如果小于当前节点往左走,否则往右走,直到走到空为止,把要插入的节点放在这。
//返回值意义是更新当前子树,想象一下从最下层开始返回的情况。
node *insert(node *p,int x){
    if(p == NULL){
        node *q = new node;
        q->val = x;
        q->lch = q->rch = NULL;
        return q;
    }else{
        if(x < p->val) p->lch = insert(p->lch, x);
        else p->rch = insert(p->rch, x);
        return p;
    }
}

//查找数值x。
//每一个节点当做一棵子树,如果当前节点不是就找它的左右子树。
bool find(node *p,int x){
    if(p == NULL) return false;
    else if(x == p->val) return true;
    else if(x < p->val) return find(p->lch, x);
    else return find(p->rch, x);
}

node *remove(node *p, int x){
    if(p == NULL) return NULL;        //当前子树没有找到,如果一个节点的左右子树都返回NULL表明当前子树没有找到
    else if(x < p->val) p->lch = remove(p->lch, x);   //向左走
    else if(x > p->val) p->rch = remove(p->rch, x);        //向右走
    //以下为找到了的情况
    //左子树为空,先保存右子树,再删除当前节点,把右子树直接挂在删除节点的原先位置。
    else if(p->lch == NULL){
        node *q = p->rch;
        delete p;
        return q;
    //左子树的右子树为空,把删除节点的左子树挂在当前位置,把删除节点的右子树挂在当前位置的右边
    //这样保证了搜索树的性质
    }else if(p->lch->rch == NULL){
        node *q = p->lch;
        q->rch = p->rch;
        delete p;
        return q;
    }else{
        //找到删除节点左子树的最右边的节点,即左子树中的最大值 q->rch
        node *q;
        for(q = p->lch;q->rch->rch != NULL; q = q->rch);
        //把最大值节点q->rch用r保存下来,把最大值节点的左子树提上来
        node *r = q->rch;
        q->rch = r->lch;
        //把最大值节点r放在了原先删除节点的位置
        r->lch = p->lch;
        r->rch = p->rch;
        delete p;
        return r;
    }
    return p;
}

int main(){

    return 0;
} 
时间: 2024-08-05 02:08:07

【模板】二叉搜索树的相关文章

[模板]二叉搜索树

tips:模板是写给自己的,所以大家可能有些看不懂,请移步参观其他dalao的模板. 一.结点构造 struct Node { int data,lson,rson; }A[N]; 二.插入insert void insert(int w_pos,int pos) { if(A[w_pos].data<A[pos].data){ if(!A[pos].lson)A[pos].lson=w_pos; else insert(w_pos,A[pos].lson); } else{ if(!A[pos

【模板】二叉搜索树(二叉排序树,二叉查找树,BST)

二叉搜索树其实就是满足左结点小于根,右结点大于根这类规则的树形结构. 1 int n; 2 int a[MAX_N]; 3 int lt[MAX_N], rt[MAX_N]; 4 // 没有则为-1 5 // 默认a[0]为根结点 6 7 void Insert(int x, int obj) // 插入结点a[obj] 8 { 9 if(a[obj] < a[x]) 10 { 11 if(lt[x] ^ -1) Insert(lt[x], obj); 12 else lt[x] = obj;

ACM-数据结构-二叉搜索树(C++实现)

近日研习<计算机算法>,一点点弄明白了二叉搜索树. /* @header BSTree @abstract BSTree @discussion Insert,delete,search and order @author WalterBright,2016 */ #include <iostream> using namespace std; template <class Type> class BSTree; //模板类作为友元类需提前声明 template &l

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

用JS实现二叉搜索树

二叉树的节点最多只能有两个子节点,一个左侧子节点,一个右侧子节点. 二叉搜索树(BST),是二叉树的一种,但只允许在左侧节点存储比父节点小的值,在右侧节点存储比父节点大或等于父节点的值. 1.创建BST 1.1创建BST类 首先申明BST类的基本结构 function BinarySearchTree() { var Node = function(key){ this.key = key; this.left = null; this.right = null; }; var root = n

538. Convert BST to Greater Tree 二叉搜索树转换为更大树

Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST. Example: Input: The root of a Binary Search Tree like thi

二叉搜索树

#include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> using namespace std; struct TreeNode { TreeNode* p; TreeNode* l; TreeNode* r; int key; TreeNode() { p = 0; l = 0; r = 0; key = -1; } }; const int RANDMOD = 30

04-树4 是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于

二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现

一.前言 一直以来,都对树有关的东西望而却步.以前每次说要看一看,都因为惰性,时间就那么荒废掉了.今天下个决心,决定好好的数据结构中的东西看一下.不知道看这篇文章的你,是不是和我有同样的感受,空有一颗努力的心,却迟迟没有付出行动.如果是的话,如果也想好好的把树的知识巩固一下的话,就让我们一起好好儿地把知识点过一遍吧.本文争取让看完的每一个没有基础的同学,都能有所收获.在正文开始前,先给自己加个油.加油(^ω^) 二.二叉搜索树的定义 二叉搜索树是指,对于某一个节点而言,它左边的节点都小于或等于它