文章标题

二叉查找树实现

性质

二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:

(1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;

(2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;

(3)、它的左、右子树也分别为二叉查找树

插入

在二叉查找树中插入新结点,要保证插入新结点后仍能满足二叉查找树的性质。例子中的插入过程如下:

a、若二叉查找树root为空,则使新结点为根;

b、若二叉查找树root不为空,则通过Insert函数寻找插入点并返回它的地址(若新结点中的关键字已经存在,则返回空指针);
c、若新结点的关键字小于插入点的关键字,则将新结点插入到插入点的左子树中,大于则插入到插入点的右子树中。

删除

删除某个结点后依然要保持二叉查找树的特性。例子中的删除过程如下:
a、若删除点是叶子结点,则设置其双亲结点的指针为空。
b、若删除点只有左子树,或只有右子树,则设置其双亲结点的指针指向左子树或右子树。
c、若删除点的左右子树均不为空,则:
1)、查询删除点的右子树的左子树是否为空,若为空,则把删除点的左子树设为删除点的右子树的左子树。
2)、若不为空,则继续查询左子树,直到找到最底层的左子树为止。
待实现

代码

#include <iostream>

using namespace std;

class Node
{
public:
    int value;
    Node *left;
    Node *right;

    Node(){left = right = NULL;}
};

class BinSearchTree
{
private:
    Node *root;

public:
    BinSearchTree(){this->root = NULL;}
    Node* Find(int value, Node* root)
    {
        if(root == NULL)
        {
            return NULL;
        }
        if (value < root->value)
        {
            Find(value,root->left);
        }
        else if(value > root->value)
        {
            Find(value,root->right);
        }
        else
        {
            return root;
        }
    }
    void Insert(Node *&root,Node*p) //此处需要使用二级指针/指针引用
    {
        if(root == NULL)
        {
            root = p;
            cout <<"root = NULL" <<endl;
        }
        if(p->value > root->value)
        {
            Insert(root->right,p);
        }
        else if(p->value < root->value)
        {
            Insert(root->left,p);
        }
    }
    void Delete(int value, Node *root)
    {
    }

    void PreOrder(Node *root)
    {
        if(root == NULL) return;
        else
        {
            cout <<root->value<< " ";
            PreOrder(root->left);
            PreOrder(root->right);
        }
    }

    void MiddleOrder(Node *root)
    {
        if(root == NULL) return;
        else
        {
            MiddleOrder(root->left);
            cout << root->value <<" ";
            MiddleOrder(root->right);
        }
    }
    void PostOrder(Node *root)
    {
        if(root == NULL) return;
        else
        {
            PostOrder(root->left);
            PostOrder(root->right);
            cout << root->value <<" ";
        }
    }

    void Print()
    {
        cout <<"前序遍历"<<endl;
        PreOrder(this->root);
        cout <<"中序遍历"<<endl;
        MiddleOrder(this->root);
        cout <<"后续遍历" <<endl;
        PostOrder(this->root);
    }
    void CreateBst(int a[],int n)
    {
        for(int i = 0; i < n; i++)
        {
            Node *p = new Node();
            p->value= a[i];
            Insert(root,p);
        }
    }
};



int main()
{
    BinSearchTree bt;
    int num;
    cout << "请输入二叉排序树个数:";
    cin >>num;
    int b[num];
    for(int i =0; i < num; i++)
    {
        cin >> b[i];
    }
    bt.CreateBst(b,num);
    bt.Print();

    cout << "Hello world!" << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值