• 二叉查找树(二叉排序树)创建,插入,删除操作。


    二叉排序树

    • 二叉排序树是一个基础的树的数据结构。应用许多。
    • 它的特性就是,左孩子小于parent。右孩子大于parent.

    寻找节点

    寻找节点就是直接依据数值的大小。从root节点開始遍历,大于当前遍历节点就向它的右子树查找,相反则查找它的左子树。

    然后返回。

    查找最大最小节点

    直接依据root节点,遍历到最右就是最大节点,遍历到最左,就是最小节点。

    插入节点

    插入节点我这里插入的节点都会成为叶子节点。依据大小的关系向下遍历,遍历到最后的节点,然后插入就能够了。

    删除节点

    这里删除节点是相对麻烦一点的。在删除的节点是一个叶子节点的时候。或者仅仅有一个孩子的时候,那么直接把当前节点删除让孩子取代自己的位置就能够了,在被删除的节点左右孩子都存在的时候,要删除当前节点,就须要用自己右子树的最小节点来取代被删除的节点。

    代码例如以下

    //
    //  main.cpp
    //  BSTree
    //
    //  Created by Alps on 14-7-31.
    //  Copyright (c) 2014年 chen. All rights reserved.
    //
    
    #include <iostream>
    #define ElementType int
    
    using namespace std;
    
    struct Node;
    typedef Node* PtrToNode;
    typedef PtrToNode TreeNode;
    
    TreeNode makeEmpty(TreeNode T);
    int isEmpty(TreeNode T);
    TreeNode findTree(ElementType X,TreeNode T);
    TreeNode findMin(TreeNode T);
    TreeNode findMax(TreeNode T);
    TreeNode insertTree(ElementType X, TreeNode T);
    TreeNode deleteTree(ElementType X, TreeNode T);
    
    struct Node{
        ElementType element;
        TreeNode left;
        TreeNode right;
    };
    
    TreeNode makeEmpty(TreeNode T){
        if (T != NULL) {
            makeEmpty(T->left);
            makeEmpty(T->right);
            free(T);
        }
        return NULL;
    }
    
    int isEmpty(TreeNode T){
        return T == NULL;
    }
    
    TreeNode findTree(ElementType X,TreeNode T){
        if (T == NULL) {
            return NULL;
        }
        if (X < T->element) {
            return findTree(X, T->left);
        }else if(X > T->element){
            return findTree(X, T->right);
        }else{
            return T;
        }
    }
    
    TreeNode findMin(TreeNode T){
        if (T == NULL) {
            return NULL;
        }
        if (T->left == NULL) {
            return T;
        }else{
            return findMin(T->left);
        }
    //    return NULL;
    }
    
    TreeNode findMax(TreeNode T){
        if (T == NULL) {
            return NULL;
        }
        if (T->right  == NULL) {
            return T;
        }else{
            return findMax(T->right);
        }
    //    return NULL;
    }
    
    TreeNode insertTree(ElementType X, TreeNode T){
        if (T == NULL) {
            T = (TreeNode)malloc(sizeof(Node));
            T->element = X;
            T->left = NULL;
            T->right = NULL;
        }else if(X > T->element){
            T->right = insertTree(X, T->right);
        }else if(X < T->element){
            T->left = insertTree(X, T->left);
        }
        return T;
    }
    
    TreeNode deleteTree(ElementType X, TreeNode T){
        TreeNode XNode = findTree(X, T);
        if (XNode == NULL || T == NULL) {
            printf("can't find the node is : %d",X);
            exit(1);
        }
        if (X > T->element) {
            T->right = deleteTree(X, T->right);
        }else if(X < T->element){
            T->left = deleteTree(X, T->left);
        }else{
            TreeNode tmp;
            if (T->left && T->right) {
                tmp = findMin(T->right);
                T->element = tmp->element;
                T->right = deleteTree( T->element, T->right);
            }else{
                tmp = T;
                if (T->left == NULL) {
                    T = T->right;
                }else
                if (T->right == NULL) {
                    T = T->left;
                }
                free(tmp);
            }
        }
        return T;
    }
    
    void PreOrderTree(TreeNode T){
        if (T != NULL) {
            printf("%d ",T->element);
            PreOrderTree(T->left);
            PreOrderTree(T->right);
        }
    }
    
    int main(int argc, const char * argv[])
    {
    
        TreeNode T = (TreeNode)malloc(sizeof(Node));
        T = makeEmpty(T);
        T = insertTree(6, T);
        T = insertTree(2, T);
        T =insertTree(8, T);
        T =insertTree(1, T);
        T = insertTree(5, T);
        T =insertTree(3, T);
        T = insertTree(4, T);
    //    printf("%d
    ",T->element);
        PreOrderTree(T);
        printf("
    ");
        TreeNode tmp;
        tmp = findTree(2, T);
        printf("%d
    ",tmp->element);
        T = deleteTree(2, T);
        PreOrderTree(T);
        printf("
    ");
        tmp = findMax(T);
        printf("%d
    ",tmp->element);
        tmp = findMin(T);
        printf("%d
    ",tmp->element);
    //    std::cout << "Hello, World!
    ";
        return 0;
    }
    


  • 相关阅读:
    深度学习模型训练之偏差与方差
    介绍一个快速确定神经网络模型中各层矩阵维度的方法
    TensorFlow简要教程及线性回归算法示例
    Web项目开发中常见安全问题及防范
    时序数据库及应用场景简介
    互联网产品怎么做数据埋点
    简述分布式跟踪系统实现原理
    MFC- socket 编程
    win32 socket 编程(六)——UDP
    win32 socket编程(五)——客户端实例(TCP)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6781213.html
Copyright © 2020-2023  润新知