二叉排序树是一种树形结构,这种树有如下几种性质
- 若左子树不空,则左子树所有节点值均小于其根节点值
- 若右子树不空,则右子树所有节点值均大于其根节点值
其左右子树也分别是二叉排序树
有了这些性质,我们便可以证明出二叉排序树的中序遍历必然有序:
下图是一个普通的二叉排序树:
那么二叉排序树就可以在OI的道路上有所应用,当然以一些小牛的本领,自然只能够使用其排序,毕竟这只是二叉排序树浅讲……所以我们引入一道例题,输入n个数,将他们排序:
分析:这一题正好符合二叉排序树的思想和性质,也就是说可以在建树后使用中序遍历遍历即可。见代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int data;
node *lchild,*rchild;
}*tree;
tree t;
void pre_crt(tree &bt,int x){
if(bt){
if(bt->data>x)
pre_crt(bt->lchild,x);
else pre_crt(bt->rchild,x);
}
else{
bt=new node;
bt->lchild=bt->rchild=NULL;
bt->data=x;
return;
}
}
void inorder(tree bt){
if(bt){
inorder(bt->lchild);
printf("%d ",bt->data);
inorder(bt->rchild);
}
}
int main(){
int i,j,k,n,m;
scanf("%d",&n);
for(i=1;i<=n;i++){
int x;
scanf("%d",&x);
pre_crt(t,x);
}
inorder(t);
puts("");
return 0;
}
当然,一些有深度思考的人们就会想:如果每一个数都比根节点小,或者都比根节点大,那么树不就退化成一条链了吗?『见下图』:
这时就不属于二叉排序树浅谈了,为了维护树的高度,需要用到平衡二叉树『这个东西下次再讲吧』。