二叉排序树设计
设计一个读入一串整数,然后构造二叉排序树,进行查找。
二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:
1.若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值。
2.若根结点的右子树非空,则右子树上所有结点的关键字值均大于等于根结点的关键字值。
3.根结点的左、右子树也分别为二叉排序树。
二叉排序树建立说明:
当需要插入一个节点到二叉排序树时,需要先找到它的父节点。
程序需求
1.从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。
2.在二叉排序树中查找某一结点。
3.用其它查找算法进行排序。
算法的基本思想
二叉排序树,又叫二叉查找树,它或者是一棵空树;
或者是具有以下性质的二叉树:
1.若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2.若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3.它的左右子树也分别为二叉排序树。
与次优二叉树相对,二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。新插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
二叉排序树的删除操作相对复杂,因为不能因为删除了结点,让这颗二叉排序树变得不满足二叉排序树的性质,所以对于二叉排序树的删除存在三种情况:
1.叶子结点;(直接删除结点)
2.仅有左或者右子树的结点;(删除结点后,将它的左子树或者右子树整个移动到删除结点的位置)
3.左右子树都有的结点。
核心思想:将它的直接前驱或者直接后继作为删除结点的数据
程序的流程
程序由三个模块组成:
1.输入模块:一个一个输入二叉排序树的结点(char)
2.计算模块:设计二叉排序树的插入,删除,先序遍历,中序遍历,后序遍历函数
3.输出模块:完成插入和删除,显示二叉排序树的遍历结果
算法的时空分析
二叉排序树的插入和查找算法的基本过程都是查找操作,所以其时间复杂度是O(log2n)
二叉排序树
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
enum BOOL
{
False,True};
typedef struct BiTNode //定义二叉树节点结构
{
char data; //为了方便,数据域只有关键字一项
struct BiTNode *lchild,*rchild; //左右孩子指针域
}BiTNode,*BiTree;
BOOL SearchBST(BiTree,char,BiTree,BiTree&); //在二叉排序树中查找元素
BOOL InsertBST(BiTree &,char); //在二叉排序树中插入元素
BOOL DeleteBST(BiTree &,char); //在二叉排序树中删除元素
void Delete(BiTree &); //删除二叉排序树的根结点
void InorderBST(BiTree); //中序遍历二叉排序树,即从小到大显示各元素
void preorderBST(BiTree);
void postorderBST(BiTree);
void main()
{
BiTree T,p;
char ch,keyword,j='y';
BOOL temp;
T=NULL;
while(j!='n')
{
printf("1.元素插入\n");
printf("2.元素查找\n");
printf("3.中序遍历\n");
printf("4.先序遍历\n");
printf("5.后序遍历\n");
printf("6.元素删除\n");
printf("7.退出\n");
scanf(" %c",&ch); //输入操作选项
switch(ch)
{
case '1':printf("请输入要插入的结点关键字(char):");
scanf(" %c",&keyword); //输入要插入元素的关键字
temp=InsertBST(T,keyword);
if(!temp) printf("%c 已经存在!\n",keyword); //该元素已经存在
else printf("成功插入%c!\n",keyword); //成功插入
break;
case '2':printf("请输入要搜索的结点关键字(char):");
scanf(" %c",&keyword); //输入要查找元素的关键字
temp=SearchBST(T,keyword,NULL,p);
if(!temp) printf("%c 没有找到!\n",keyword); //没有找到
else printf("成功找到%c!\n",keyword); //成功找到
break;