今天学习到二叉排序树,课本上提到了二叉排序树的非递归实现,我写了下
//
// 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);//非递归插入
}