二叉搜索树定义:
根节点大于左叶结点小于右叶结点,右结点值大于左结点值,左右子树都是二叉搜索树
搜索二叉树的插入:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct TNode *Tree; typedef Tree BinTree; //定义一个TNode struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; //在二叉搜索树BST中插入元素X BinTree Insert(ElementType X,BinTree BST) { //如果二叉搜索树为空,则建立新的结点并返回 if (!BST){ BST = (struct TNode *)malloc(sizeof(struct TNode)); BST->Data = X; BST->Left = BST->Right = NULL; } //如果搜索二叉树不为空,则找元素插入的位置 else if (X < BST->Data){ //则说明在位置在左子树中,在左子树中递归找到位置并放入 BST->Left = Insert(X, BST->Left); } else if (X > BST->Data){ //则说明在位置在右子树中,在左子树中递归找到位置并放入 BST->Right = Insert(X, BST->Right); } return BST; //插入后,返回搜索二叉树BST }
搜索二叉树的删除:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct TNode *Tree; typedef Tree BinTree; typedef BinTree Position; //定义一个TNode struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; BinTree Delete(ElementType X, BinTree BST) { Position Tmp; if (!BST) printf("树为空,找不到要删除的元素!"); else if (X < BST->Data) //要删除的元素在左子树上,递归删除元素 BST->Left = Delete(X, BST->Left); else if (X > BST->Data) //要删除的元素在右子树上,递归删除元素 BST->Right = Delete(X, BST->Right); //不小不大,则证明找到了。 //删除元素有左孩子和右孩子,则在删除结点的左子树上找到最大的元素代替删除元素, //或者在右孩子中找到最小的元素弥补上 else if (BST->Left && BST->Right){ Tmp = FindMin(BST->Right); BST->Data = Tmp->Data; BST->Right = Delete(BST->Data, BST->Right); //删除位置结点 } else { //被删除结点有一个或者无子结点 Tmp = BST; //左边空,赋右边值 if (!BST->Left) BST = BST->Right; //右边空,赋左边值 else if (!BST->Right) BST = BST->Left; free(Tmp); } return BST; }