1、定义
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
2、基本性质:
(1)就是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。
(3)换句话说就是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。
(4)二叉排序树的中序遍历等于一串数的的从小到大的排序。
(5)二叉排序树的最小元素是最左孩子的左结点,最大元素是最右孩子的右节点。
3、基本操作:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct Node{
int data;
struct Node *Left,*Right;
};
typedef struct Node* BST;
//查找
//f为指向t的双亲初始值为NULL;如果查找成功,p指向该数据元素的结点,并返回true,否则返回查找的最后一个节点,返回false
bool Search(BST t,int x,BST f,BST *p)
{
if(!t)
{
*p=f;
return false;
}
else if(x==t->data)
{
*p=t;
return true;
}
else if(x<t->data) return Search(t->Left,x,t,p);
else return Search(t->Right,x,t,p);
}
//插入
bool Insert(BST *t,int x)
{
BST p,s;
if(!Search(*t,x,NULL,&p))
{
s=new Node;
s->data=x;
s->Left=s->Right=NULL;
if(!p) *t=s;
else if(x<p->data) p->Left=s;
else p->Right=s;
return true;
}
else return false;
}
//删除
bool Delete(BST p)
{
BST q,s;
if(p->Left==NULL)
{
q=p;p=p->Left;delete q;
}
else if(p->Right==NULL)
{
q=p;p=p->Right;delete q;
}
else
{
q=p;s=p->Left;
while(s->Right)
{
q=s;s=s->Right;
}
p->data=s->data;
if(q!=p) q->Right=s->Left;
else q->Left=s->Left;
delete s;
}
return true;
}
bool DeleteBST(BST t,int x)
{
if(t==NULL) return false;
else
{
if(x==t->data) return Delete(t);
else if(x<t->data) return DeleteBST(t->Left,x);
else return DeleteBST(t->Right,x);
}
}
vector <int> v;
void inorder(BST t,vector <int> &vc) //二叉搜索树的中序遍历是它从小到大排列。
{
if(t->Left!=NULL) inorder(t->Left,vc);
vc.push_back(t->data);
if(t->Right!=NULL) inorder(t->Right,vc);
}
int main(void)
{
int i;
int a[10]={3,4,1,2,5,6,7,9,8,10};
BST t=NULL;
for(i=0;i<10;i++)
{
Insert(&t,a[i]);
}
inorder(t,v);
for(i=0;i<10;i++) printf("%d ",v[i]);
return 0;
}
参考文章:https://blog.csdn.net/yixianfeng41/article/details/52802855