数据结构学习记录-二叉搜索树
来源:互联网 发布:软件java 编辑:程序博客网 时间:2024/05/29 11:06
二叉搜索树(BST Binary Search Tree) 二叉排序树,二叉查找树
二叉搜索树:可以为空,如果不为空
①非空左子树的所有键值小于其根结点的键值
②非空右子树的所有键值大于其根结点的键值
③左右子树都是二叉搜索树
//Binary Search Tree操作的特别函数
Position Find(ElementType X,BinTree BST);
Position FindMin(BinTree BST);
Position FindMax(BinTree BST);
BinTree Insert(ElementType X,BinTree BST);
BinTree Delete(ElementType X,BinTree BST);
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode* Position;
typedef Position BinTree; //二叉树类型
struct TNode //树结点定义
{
ElementType Data; //结点数据
BinTree Left; //指向左子树
BinTree Right; //指向右子树
};
//尾递归
Position Find(ElementType X,BinTree BST)
{
if(!BST)
return NULL;
if(X > BST->Data)
return Find(X,BST->Right); //在右子树中继续查找
else if(X < BST->Data)
return Find(X,BST->Left); //在左子树中继续查找
else //X==BST->Data
return BST; //查找成功,返回结点的地址
}
//迭代
Position IterFind(ElementType X,BinTree BST)
{
while(BST)
{
if(X > BST->Data)
BST = BST->Right;
else if(X < BST->Data)
BST = BST->Left;
else
return BST;
}
return NULL;
}
//查找最小元素的递归函数
Position FindMin(BinTree BST)
{
if(!BST)
return NULL; //空的二叉树返回NULL
else if(!BST->Left)
return BST; //找到最左叶结点并返回
else
return FindMin(BST->Left); //沿左分支继续查找
}
//查找最大元素的迭代函数
Position FindMax(BinTree BST)
{
if(BST)
{
while(BST->Right)
BST = BST->Right;
return BST;
}
else
return NULL;
}
//二叉搜索树的插入
BinTree Insert(ElementType X,BinTree BST)
{
if(!BST) //若原树为空,生成并返回一个结点的二叉搜索树
{
BST = (BinTree)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;
}
//二叉搜索树的删除
/*考虑三种情况
①删除叶结点,直接删除,修改父结点指针为NULL
②删除的结点只有一个孩子结点,修改父结点的指针指向要删除结点的孩子结点
③要删除的结点有左右两棵子树,用另一结点替代被删除结点,右子树的最小元素或左子树的最大元素*/
BinTree Delete(ElementType X,BinTree BST)
{
Position Tmp;
if(!BST)
printf("not find the element you want to delete\n");
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(X,BST->Right); //在删除结点的右子树中删除最小元素
}
else //被删除结点有一个或无孩子结点
{
Tmp = BST;
if(!BST->Left) //有右孩子或无孩子结点
BST = BST->Right;
if(!BST->Right) //有左孩子或无孩子结点
BST = BST->Left;
free(Tmp);
}
return BST;
}
- 数据结构学习记录-二叉搜索树
- 数据结构学习笔录--二叉搜索树
- 数据结构学习记录-二叉树的遍历
- 数据结构二叉搜索树
- 数据结构-----二叉搜索树
- 数据结构:二叉搜索树
- 数据结构 ---- 二叉搜索树
- 数据结构-二叉搜索树
- 【数据结构】二叉搜索树
- 【数据结构】二叉搜索树
- 数据结构---------二叉搜索树
- 数据结构--‘搜索二叉树’
- 【数据结构】二叉搜索树
- 【数据结构】二叉搜索树
- 数据结构::搜索二叉树
- 【数据结构】二叉搜索树
- 数据结构-二叉搜索树
- 数据结构:二叉搜索树
- [ZJOI2014]力 FFT基本套路实践
- HTML-Web-Storage(设置-展示-遍历-清空)
- java循环练习
- SpringBoot+MyBatis整合开发
- 微信朋友圈大变动!广告发多了原来会这样……
- 数据结构学习记录-二叉搜索树
- 我的第一个Java Struts demo, 卡在404
- 机器学习的其他名称(找工作模糊搜索)
- 学习很久之后决定开始写博客来阶段性总结
- docker问题汇总
- JAVA-transient 关键字
- redis配置认证密码
- javascript数组的排序及查找
- 23 状态列举