二叉查找树(简单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 *search_tree;
typedef struct _Tree_node *position;

position find(element_type __x, search_tree tree)
{
    if (tree == NULL) {
        printf("No this node!\n");
        return NULL;
    }
    else if (__x < tree->data) {
        return find(__x, tree->left);
    }
    else if (__x > tree->data) {
        return find(__x, tree->right);
    }
    else {
        return tree;
    }
}

position find_min(search_tree tree)
{
    if (tree == NULL) {
        return NULL;
    }
    else if (tree->left == NULL) {
        return tree;
    }
    else {
        return find_min(tree->left);
    }
}

position find_max(search_tree tree)
{
    if (tree == NULL) {
        return NULL;
    }
    else if (tree->right == NULL) {
        return tree;
    }
    else {
        return find_max(tree);
    }
}

void insert(element_type __x, search_tree *tree)
{
    if (*tree == NULL) {
        *tree = (search_tree) malloc((size_t) 1 * sizeof(struct _Tree_node));
        if (*tree == NULL) {
            printf("out of memory.\n");
            exit(1);
        }
        else {
            (*tree)->data = __x;
            (*tree)->left = (*tree)->right = NULL;
        }
    }
    else if (__x < (*tree)->data) {
        insert(__x, &((*tree)->left));
    }
    else if (__x > (*tree)->data) {
        insert(__x, &((*tree)->right));
    }
    else {
        ;
    }
}

void delete(element_type __x, search_tree *tree)
{
    position tmp = NULL;

    if (*tree == NULL) {
        printf("Not found!\n");
    }
    else if (__x < (*tree)->data) {
        delete(__x, &((*tree)->left));
    }
    else if (__x > (*tree)->data) {
        delete(__x, &((*tree)->right));
    }
    else if ((*tree)->left && (*tree)->right) {
        tmp = find_min((*tree)->right);
        (*tree)->data = tmp->data;
        delete((*tree)->data, &((*tree)->right));
    }
    else {
        tmp = *tree;
        if ((*tree)->left == NULL) {
            *tree = (*tree)->right;
        }
        else if ((*tree)->right == NULL) {
            *tree = (*tree)->left;
        }

        free(tmp);
    }
}

void print_by_pre(search_tree tree)
{
    if (tree != NULL) {
        printf("value is %d.\n", tree->data);
        print_by_pre(tree->left);
        print_by_pre(tree->right);
    }
}

void print_by_in(search_tree tree)
{
    if (tree != NULL) {
        print_by_in(tree->left);
        printf("value is %d.\n", tree->data);
        print_by_in(tree->right);
    }
}

void print_by_post(search_tree tree)
{
    if (tree != NULL) {
        print_by_post(tree->left);
        print_by_post(tree->right);
        printf("value is %d.\n", tree->data);
    }
}

#endif

时间: 2024-07-31 14:35:09

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

二叉查找树简单实现

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

查找(一):二分查找和二叉查找树

二分查找 二分查找的原理很简单:在一个有序数组中(本文讨论的是升序,降序同理) 从数组中间的元素开始,如果A[mid]大于被查找元素key,那么就在A[0]到A[mid-1]中查找,反之在A[mid++]到A[A.lenth - 1]中查找. 从这看来,递归的意味又很浓啊,当然也可以用非递归的方式,效率更高,意味二分查找比较简单,就直接上代码了: 定义一个查找抽象基类: public abstract class SearchBase { public Integer[] a = {0 ,1 ,

数据结构与算法问题 二叉搜索树

1.序 具体实现了二叉查找树的各种操作:插入结点.构造二叉树.删除结点.查找.  查找最大值.查找最小值.查找指定结点的前驱和后继 2.二叉查找树简单介绍 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上全部结点的值均小于它的根结点的值. (2)若右子树不空.则右子树上全部结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树 3.二叉查找树的各种操作 此处给出代码.凝视很具体.具体操作请參考代码: #include <iostream> using

二叉查找树的简单实现

二叉查找树是   左子节点 <= 根节点 <= 右子节点 的树形结构,其平均时间复杂度:O(log2n)(简单地说搜索方式跟二分法差不多). 二叉排序树是一种动态树表.其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入. 新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点. 先定义二叉树和树节点: typedef struct BST_node{ int data; struct BST

二叉查找树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

图解数据结构(7)——二叉查找树及平衡二叉查找树(一共14篇)

这篇将是最有难度和挑战性的一篇,做好心理准备!十.二叉查找树(BST)前一篇介绍了树,却未介绍树有什么用.但就算我不说,你也能想得到,看我们Windows的目录结构,其实就是树形的,一个典型的分类应用.当然除了分类,树还有别的作用,我们可以利用树建立一个非常便于查找取值又非常便于插入删除的数据结构,这就是马上要提到的二叉查找树(Binary Search Tree),这种二叉树有个特点:对任意节点而言,左子(当然了,存在的话)的值总是小于本身,而右子(存在的话)的值总是大于本身. 这种特性使得我

数据结构——二叉查找树

使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值.这意味着,该树所有的元素以某种统一的方式排序. 二叉查找树的声明 二叉查找树是一棵特殊的二叉树,二叉查找树中节点的结构与二叉树种节点的结构相同,关键在于可以在二叉查找树上可以执行的操作以及对其进行操作的算法.二叉查找树的声明如下: #ifndef  _Tree_H struct TreeNode; typedef struct TreeNode *Posit