美文网首页
二叉排序树

二叉排序树

作者: 棒棒0_0 | 来源:发表于2018-07-26 14:27 被阅读0次
#include <stdio.h>

typedef struct _Node
{
    int value;
    _Node* parent;
    _Node* left;
    _Node* right;
}Node;

Node* root;
void BSTree_destroy(Node* node)
{
    if (node == NULL)
        return;
    BSTree_destroy(node->left);
    BSTree_destroy(node->right);
    delete node;
}

void BSTree_init()
{
    BSTree_destroy(root);
}

Node* BSTree_search(int value)
{
    Node* node = root;
    while (node)
    {
        if (node->value < value)
            node = node->right;
        else if (node->value > value)
            node = node->left;
        else
            return node;
    }
    return NULL;
}

void BSTree_insert(int value)
{
    Node* parent = NULL;
    Node* node = root;
    while (node)
    {
        parent = node;
        if (node->value < value)
            node = node->right;
        else if (node->value > value)
            node = node->left;
        else
            return;
    }

    Node* new_node = new Node;
    new_node->value = value;
    new_node->parent = NULL;
    new_node->left = new_node->right = NULL;
    if (!parent)
        root = new_node;
    else
    {
        if (parent->value < value)
            parent->right = new_node;
        else
            parent->left = new_node;
    }
    new_node->parent = parent;
}

void BSTree_delete(Node* node)
{
    Node* parent = node->parent;
    if (!node->left && !node->right)//node为叶子结点
    {
        if (!parent)
            root = NULL;
        else
        {
            if (parent->left == node)
                parent->left = NULL;
            else
                parent->right = NULL;
        }
        delete node;
    }
    else if (node->left && node->right)//node结点左右子树均不为空
    {
        Node* pre_node= node->left;
        while (pre_node->right)
        {
            pre_node = pre_node->right;
        }
        node->value = pre_node->value; //找到直接前驱,替换当前节点
        if (pre_node->parent == node) //未执行上述while循环,重接左子树
            pre_node->parent->left = pre_node->left;
        else                          //执行上述while循环,重接右子树
            pre_node->parent->right = pre_node->left;
        if (pre_node->left)
            pre_node->left->parent = pre_node->parent;
        delete pre_node;
    }
    else//node结点的左子树为空或者右子树为空
    {
        Node* child = node->left ? node->left : node->right;
        if (!parent)
        {
            root = child;
            child->parent = root;
        }
        else
        {
            child->parent = parent;
            if (parent->left == node)
                parent->left = child;
            else
                parent->right = child;
        }
        delete node;
    }
}
int main(void)
{
    BSTree_init();
    BSTree_insert(8);
    BSTree_insert(3);
    BSTree_insert(10);
    BSTree_insert(1);
    BSTree_insert(6);
    BSTree_insert(14);
    BSTree_insert(4);
    BSTree_insert(7);
    BSTree_insert(13);

    Node* node = BSTree_search(100);
    if (!node || node->value != 100)
        printf("search error!\n");

    node = BSTree_search(10);
    if (!node || node->value != 10)
        printf("search error!\n");
    else
        BSTree_delete(node);

    node = BSTree_search(3);
    if (!node || node->value != 3)
        printf("search error!\n");
    else
        BSTree_delete(node);

    node = BSTree_search(8);
    if (!node || node->value != 8)
        printf("search error!\n");
    else
        BSTree_delete(node);

    return 0;
}

相关文章

  • 详解Java二叉排序树

    姓名: 李小娜 [嵌牛导读] :这篇文章主要介绍了Java二叉排序树,包括二叉排序树的定义、二叉排序树的性质、二叉...

  • Java数据结构:二叉排序树(BST)

    一、基本介绍 二叉排序树 BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一...

  • 2018-06-19/20 机试准备09

    数据结构 四、二叉排序树 对二叉排序树进行中序遍历 结果必然是一个递增序列 所以通过建立二叉排序树可以对无序序列进...

  • 二叉搜索树(BST)

    构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找的效率。 那么什么是二叉排序树呢?二叉排序树具有以下...

  • Binary Search Tree

    如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为 ,其查找效率为 ,近似于折半查找。如果二叉排序树完全不平衡...

  • 红黑树

    二叉排序树 非空二叉排序树具有如下特点: 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点...

  • 数据结构之二叉排序树

    二叉排序数 1.二叉排序树介绍 二叉排序树:BST: (Binary Sort(Search) Tree), 对于...

  • 数据结构学习第四弹 二叉排序树

    二叉排序树又称为二叉搜索树或二叉查找树,这是一种插入、删除和检索记录效率都很高的树结构 二叉排序树概念 二叉排序树...

  • 数据结构与算法——基础篇(五)

    二叉排序树——BST——Binary Sort(Search) Tree 二叉排序树的出现是为了解决数组的查询快,...

  • 看图说话之平衡二叉排序树

    本文在看图说话之二叉排序树的基础上介绍了平衡二叉排序树,结构性较好的二叉排序树其插入和删除操作的时间复杂度接近Lo...

网友评论

      本文标题:二叉排序树

      本文链接:https://www.haomeiwen.com/subject/curbmftx.html