9.4 二叉查找树(BST)
9.4.1 二叉查找树的定义;
9.4.2 二叉查找树的基本操作:
1.查找操作:
//search函数查找二叉查找树中数据域为x的结点
//void类型函数search, 形参:node类型的指针root和int类型x
//如果是空树则查找失败,并且输出search failded;
//如果查找成功,就输出该数字
//如果x比根结点数据域小,则在左边进行搜索,反之,在右边搜索
void search(node *root,int x)
{
if(root==NULL) //如果是空树,则查找失败
{
cout << "search failded\n";
return ;
}
if(x==root->data) //查找成功,则直接输出
{
cout << root->data;
}
else if(x>roo->data)
{
search(root->rchild,x);
}
else
{
search(root->lchild,x);
}
}
插入操作:
//insert函数将在二叉树中插入一个数据域为x的新结点
//如果为空树,则说明查找失败,就到了插入位置,然后调用一个newNode函数新建一个结点为root,并且直接返回
//如果查找成功,则直接退出循环
//同样如果值小,则往左子树走,反之,往右子树走
void insert(node *root, int x)
{
if(root==NULL) //如果是空树,则查找失败
{
root=newNode(x); //新建一个结点
return ;
}
if(root->data==x)
{
return ;
}
else if(root->data>x)
{
insert(root->lchild,x);
}
else
{
insert(root->rchild,x);
}
}
二叉树的建立:
//二叉查找树的建立
//函数类型:node类型的指针,形参:int类型的数组data, int类型n
//新建一个结点node类型 root,初始值为空,for循环,调用insert函数
//返回根结点
node *Create(int data[],int n)
{
node *root=NULL;
for(int i=0; i<n; i++)
{
insert(root,data[i]); //将data[0]~~data[n-1]插入到root中
}
return root; //最后返回根结点
}
4.二叉树的删除:
//寻找以root为根结点的数中的最大权值结点
//node的指针类型:函数名findMax 形参:node的指针类型:root
//while循环,循环root的右结点,直到没有右孩子
root *findMax(node *root)
{
while(root->rchild!=NULL)
{
root=root->rchild;
}
return root;
}
//while循环一直往左边,直到为空
root *findMin(node *root)
{
while(root->lchild!=NULL)
{
root=root->lchild;
}
return root;
}
//删除以root为根结点的树中权值为x的结点
//void类型函数: 函数名:deleteNode 形参:node指针类型 &root ,int类型参数 x
/*
1.如果root为空,则直接返回NULL
2.如果找到欲删除结点
1.如果左孩子,右孩子均为空,则直接把root设置为NULL,直接删除
2.如果左孩子不为空:
1.设置node指针类型pre来存放root的先驱结点,
2.用先驱结点pre->root来存放root->data
3.调用deleteNode函数:第一个参数为root->lchild,第二个参数为pre->data 表示的意思是用pre->data来代替root->lchild
3.如果右孩子不为空:
1.设置node指针类型 next来存放后继结点
2.用后继结点来代替更结点
3.直接删除结点next
3.如果根结点的数值>x,则调用deleteNode函数,其中第一个参数为左子树
4.如果根结点的数值<x,则调用deleteNode函数,其中第一个参数为右子树
*/
void deleteNode(node *&root,int x)
{
if(root==NULL)
return ;
if(root->data==x)
{
if(root->lchild==NULL && root->rchild==NULL)
{
root=NULL;
}
else if(root->lchild!=NULL)
{
node *pre=findMax(root->lchild); //调用findMax函数,参数为root->lchild
root->data=pre->data;
deleteNode(root->lchild,pre->data);
}
else if(root->rchild!=NULL)
{
node *next=findmin(root->rchild);
root->data=next->data;
deleteNode(root->rchild,next->data);
}
else if(root->data>x)
{
deleteNode(root->lchild,x);
}
else
{
deleteNode(root->rchild,x);
}
}
}