二叉排序树浅讲

来源:互联网 发布:app软件操作说明书 编辑:程序博客网 时间:2024/05/20 05:46

二叉排序树是一种树形结构,这种树有如下几种性质

  1. 若左子树不空,则左子树所有节点值均小于其根节点值
  2. 若右子树不空,则右子树所有节点值均大于其根节点值
  3. 其左右子树也分别是二叉排序树
    有了这些性质,我们便可以证明出二叉排序树的中序遍历必然有序:
    二叉排序树
    下图是一个普通的二叉排序树:
    这里写图片描述

    那么二叉排序树就可以在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;}

当然,一些有深度思考的人们就会想:如果每一个数都比根节点小,或者都比根节点大,那么树不就退化成一条链了吗?『见下图』:
这里写图片描述

这时就不属于二叉排序树浅谈了,为了维护树的高度,需要用到平衡二叉树『这个东西下次再讲吧』。