二叉排序树的查找与插入的递归与非递归C语言实现

今天学习到二叉排序树,课本上提到了二叉排序树的非递归实现,我写了下

//
// Created by gxj on 2021/4/19.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int ElementType;
typedef struct BiTNode {
    ElementType data;
    struct BiTNode *left, *right;
} BiTNode, *BiTree;

//二叉排序树非递归查找,最坏空间复杂度Sn=O(1)
BiTNode *NoRBST_Search(BiTree T, ElementType key) {
    while (T != NULL && key != T->data) {
        if (key < T->data) {  //小于,则在左子树上查找
            T = T->left;
        } else {
            T = T->right;   //若大于,在右子树上查找
        }
    }
    return T;
}

//二叉排序树递归查找,最坏空间复杂度Sn=O(h),h为树的高度
BiTNode *BST_Search(BiTree T, ElementType key) {
    if (T == NULL) {
        return NULL;    //二叉树排序树为空,查找失败
    }

    if (key == T->data) {
        return T;   //查找成功
    } else if (key < T->data) {
        return BST_Search(T->left, key);//小于递归查找左子树
    } else {
        return BST_Search(T->right, key);//大于递归查找左子树
    }
}

//二叉排序树递归插入,*T是二级指针,最坏空间复杂度Sn=O(h),h为树的高度
int BST_Insert(BiTree *T, ElementType key) {
    if (*T == NULL) {  //原来树为空,申请结点将其插入进去
        BiTree pnew = (BiTree)calloc(sizeof(BiTNode), 1);
        pnew->data = key;
        pnew->left = pnew->right = NULL;
        *T = pnew;
        return 1;   //成功插入
    }

    if (key == (*T)->data) {
        return 0;   //插入失败
    } else if (key < (*T)->data) {
        return BST_Insert((*T)->left, key);//插入到左子树
    } else {
        return BST_Insert((*T)->right, key);//插入到右子树
    }
}

//二叉排序树非递归插入,最坏空间复杂度Sn=O(1)
int NoRBST_Insert(BiTree *T, ElementType key) {
    BiTNode *pre = NULL;//二叉树里最后一个结点
    if (T == NULL) {  //原来树为空,申请结点将其插入进去
        BiTree pnew = (BiTree)calloc(sizeof(BiTNode), 1);
        pnew->data = key;
        pnew->left = pnew->right = NULL;
        *T = pnew;
        return 1;   //成功插入
    }

    //获取到最后一个结点
    while (*T != NULL) {
        if (key == (*T)->data) {
            return 0;   //二叉排序树里不可能存在相同的结点,插入失败
        } else if (key < (*T)->data) {
            pre = *T;
            *T = (*T)->left;//遍历左孩子
        } else {
            pre = *T;
            *T = (*T)->right;//遍历右孩子
        }
    }

    //插入到左子树
    if (key < pre->data) {
        BiTNode *pnew = (BiTNode *) calloc(sizeof(BiTNode), 1);
        pnew->data = key;
        pre->left = pnew;
    } else {   //到了此步已经不存在等于的情况
        //插入到右子树
        BiTNode *pnew = (BiTNode *) calloc(sizeof(BiTNode), 1);
        pnew->data = key;
        pre->right = pnew;
    }
}

int main() {
    BiTree T;
    ElementType key = 3;
    NoRBST_Search(T, key);//二叉排序树非递归查找
    BST_Search(T, key);//二叉排序树递归查找
    BST_Insert(&T, key);//递归插入
    NoRBST_Insert(&T, key);//非递归插入
}

猜你喜欢

转载自blog.csdn.net/gxy03/article/details/115874623