二叉查找树的简单实现

二叉查找树是   左子节点 <= 根节点 <= 右子节点 的树形结构,其平均时间复杂度:O(log2n)(简单地说搜索方式跟二分法差不多)。

二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。

新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。

先定义二叉树和树节点:

typedef struct BST_node{
    int data;
    struct BST_node* left;
    struct BST_node* right;
}BST_Node;
typedef struct BST{
    BST_Node* root;
    size_t size;
};

再给出创建节点和删除的函数:

//定义一个函数用来用传入的数据创建节点
BST_Node* creat(int data){
    BST_Node* node= (BST_Node*)malloc(sizeof(BST_Node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

//定义一个函数用来删除某个节点void destroy(BST_Node* node){    free(node);}

然后实现二叉查找树的主要部分在于插入、删除操作该如何实现。

首先来看插入:

要插入一个数据,同时保持树的特性不改变。这里根据要插入的数据与根节点数据的大小关系来选择插入左子树还是右子树,当根节点为空节点时就放到根节点中;

//该函数用来向以root为根的子树中插入node节点
void insert(BST_Node*  node,  BST_Node** root){
          //这里用二级指针的目的在于直接修改root为根的子树,函数体中对源节点的修改要用一级指针的形式(二级解引用)
    if(!*root)
        *root = node;
    else if( node->data < (*root)->data)
               insert(node,  &(*root)->left);
          //要插入左子树时可以看成向左子节点为根的二叉树中插入node,于是递归调用,这个递归终止条件就是*root为空,也就是说当找到某一路径的最底层子节点的子节点时插入;          //查找树的特性通过if()中的判断选择来维持;
            else
               insert( node,  &(*root)->right);
}
//插入函数
void bst_insert(BST* bstree, int data){
    insert( creat(data), &bstree->root);
    ++size;
}

插入ok,再来删除:

//先定义一个函数用来返回在以root为根节点的子树中,查找到数据data的节点,然后如下图所示:
//           1
//          / \
//         0   3   ->例如,要删除3,找到3的节点,然后将节点3的左子树挪到3的右子树的最左下
//            / \       (也就是把2插入到3的右子树,当然结果肯定是在右子树的最左下)
//           2   4      (删除的调整方法有两种)
//          / \  / \

BST_Node*  tofind(int data, BST_Node** root){
    if((*root)->data == data || !*root)
         return root;
    if(data < (*root)->data)
         tofind(data, &(*root)->left);
    if(data > (*root)->data)
         tofind(data, &(*root)->right);
}

bool delete(int data,BST* bstree){
    BST_Node** node = tofind(data, &(bstree->root));
    if(*node){
        insert((*node)->left, (*node)->right);
        BST_Node* node_tmp = *node;
        *node = (*node)->right;
        destroy(node_tmp);
        --size;
        return true;
    }
    else
        return false;
}

删除ok,其他的功能可以在插入、删除的功能上扩展出来,不重复了。

时间: 2024-08-02 19:03:19

二叉查找树的简单实现的相关文章

算法导论读书笔记(14) - 二叉查找树的具体实现

算法导论读书笔记(14) - 二叉查找树的具体实现 目录 二叉查找树的简单Java实现 二叉查找树的简单Java实现 /** * 二叉查找树 * 部分代码参考自TreeMap的源码 */ public class BinarySearchTree<T> { protected TreeNode<T> root = null; private final Comparator<? super T> comparator; private int size = 0; pub

常见数据结构与算法整理总结(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

【转】数据结构与算法(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

Mysql与索引有关的树的概念

1.简单地认识下与索引有关的数据结构: 树的简单概念:由n个节点组成具有层次关系的集合,根朝上叶朝下 树的特点:每个节点有0或多个子节点,无父节点称为根节点,每个非根节点有且只有一个父节点,每个节点可分为多个不相交的子树(父节点除外) 二叉树的简单概念:每个节点最多有2个子树的树结构,有左右子树之分 二叉查找树的简单概念:二叉树的前提下,左子树上所有节点的值均小于/等于其父节点的值,右子树上所有几点的值均大于/等于其父节点的值,左右子树也分别为二叉查找树 二叉查找树的查找步骤:小于往左,大于往右

二叉查找树简单实现

树是一种简单的数据结构,其大部分操作的运行时间平均为O(logN).我将<数据结构与算法分析>上的的代码片段加入自己的理解简单实现了该结构: BinarySearchTree.h源码如下: #ifndef BINARYSEARCHTREE_H #define BINARYSEARCHTREE_H #include <iostream> template <typename Comparable> class BinarySearchTree { public: Bina

二叉查找树(简单C实现)

#ifndef _BIN_TREE_H #define _BIN_TREE_H #include <stdio.h> #include <stdlib.h> #include <stddef.h> struct _Tree_node { int data; struct _Tree_node *left; struct _Tree_node *right; }; typedef int element_type; typedef struct _Tree_node *s

二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树. 就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单. 根据BST的性质可以很好的解决这些东西 1.查询值 int Search(int k,int x) { if(x<a[k].key && a[k].l) Search(a[k].l,x); else if(x>a[k].key && a[k].r) Search(a[k].r,x); else retur

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

[二叉查找树] 二叉排序树

题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入 输入第一行包括一个整数n(1<=n<=100).接下来的一行包括n个整数. 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序.中序和后序遍历.每种遍历结果输出一行.每行最后一个数据之后有一个空格. 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21