二叉排序树

来源:互联网 发布:淘宝个体工商户的优势 编辑:程序博客网 时间:2024/06/05 20:05

二叉排序树,又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。它的左右子树叶分别称为二叉排序树。构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上查找,速度总是要快于无序的数据集的,而二叉排序树这种非线性的结构,也有利于插入和删除的实现。
通过一段程序看看二叉查找树是如何运作的:
递归查找二叉排序树T中是否存在key,指针f指向查找路径上访问的最后一个结点,其初始值为NULL。若查找成功则指针p指向该数据元素结点,并返回TRUE,否则指针p指向f并返回FALSE
注意:使用结构体指针前需要现为该结构体指针申请内存空间才能对指针进行操作。

    Node *sp = NULL;    sp = new Node;    sp->data = 110;    cout << sp->data << endl;

二叉排序树建立:

typedef struct BiNode{    int data;    struct BiNode *LC, *RC;}Node,*BiTree;bool InsertBST(Node *&p, int key){    if (p == NULL){        p = new Node;        p->data = key;        p->LC = p->RC = NULL;    }    if (p->data == key){        return false;    }    else if (p->data > key)return InsertBST(p->LC, key);    else return InsertBST(p->RC, key);}void creatBST(Node *&T,int a[],int n){    T = NULL;    for (int i = 0; i < n; ++i){        InsertBST(T, a[i]);    }}

二叉排序树查找操作

bool SearchBST(BiTree T, int key){    if (T == NULL)return false;    else if (T->data == key)return true;    else if (T->data>key)return SearchBST(T->LC, key);    else return SearchBST(T->RC, key);}

二叉排序树删除操作

bool DeleteBST(BiTree T, int key){    if (T == NULL)return false;    else if (key == T->data)    {        Delete(T);        return true;    }    else if (key < T->data){        return DeleteBST(T->LC, key);    }    else{        return DeleteBST(T->RC, key);    }}bool Delete(Node*& T){    BiTree P;    if (T->LC == NULL&&T->RC == NULL){        T = NULL;    }    else if (T->LC == NULL)T = T->RC;    else if (T->RC == NULL)T = T->LC;    else{        P = T->LC;        while (P->RC)P = P->RC;        P->RC = T->RC;        T = T->LC;    }    return true;}
0 0