二叉查找树

来源:互联网 发布:python 英文词性标注 编辑:程序博客网 时间:2024/06/06 02:49

1、定义

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree);

所谓二叉查找树,就是保证对于任意一点,若左子树非空,左子树上所有结点的值都小于它本身,若右子树非空,右子树上所有结点的值大于它本身。那么显然,它没有值相等的结点,而且中序遍历就是一个从小到大的排好序的序列。

2、实现

通过点的逐次插入实现,时间复杂度为O(nlogn)。

例:集合{3458196}
首先插入3,因为当前是一棵空树,那么3就是根节点(其实选任意一个结点为根节点,都可以建出来);

然后插入4,4>3,到它右儿子结点,因为右儿子结点空,故4为3的右儿子结点;

然后插入5,5>3,到它右儿子结点4,5>4,再到右儿子结点,因为右儿子结点空,故5是4的右儿子结点;

然后插入8,同理它是5的右儿子结点;以此类推,19是8的右儿子结点;

最后插入6,6>3,6>4,6>5,但是6<19,所以它是19的左儿子结点。

本人不擅长作图,大家可以在画图软件上画一画以方便理解。

代码:

1 void insert(int i,int now) //i为当前结点,now为其键值
2 {
3     if (i>m) //m为总结点数
4     {
5          m++;
6         a[m].value=now; //a[i].value表示第i点的键值
7         return;
8    }
9    if (now<a[i].value)

10  {
11       if (a[i].l!=0)
12            insert(a[i].l,now);
13        else
14        {
15            a[i].l=m+1;
16            insert(m+1,now);
17        }
18    } //a[i].l表示左儿子结点
19    else if (now>a[i].value)
20    {
21        num[i]++;
22        if (a[i].r!=0)
23            insert(a[i].r,now);
24        else
25        {
26            a[i].r=m+1;
27            insert(m+1,now);
28        }
29    } //a[i].r表示右儿子结点
30}