二叉搜索树 的查找插入和删除

#include<iostream>
using namespace std;

const int length = 10;
typedef struct TreeNode
{
    int data;
    struct TreeNode*left;
    struct TreeNode*right;
}  *BinTree;


void InsertSearchNode(BinTree&root, BinTree&T)
{
    if (root->data > T->data )
    {
        if( root->left == nullptr)
            root->left = T;
        else
            InsertSearchNode(root->left, T);
    }
    

    if (root->data < T->data )
        
    {
        if (root->right == nullptr)
        root->right = T;
        else
            InsertSearchNode(root->right, T);
    }
    

}

void Insert(BinTree &tree, BinTree &T)
{
    //把T二叉树插入Tree二叉树中
    if (tree == nullptr)
        tree = T;
    else
        InsertSearchNode(tree,T);
}

void BuildBinTree(BinTree &tree, int *a)
{
    
    for (int i = 0; i < length; i++)
    {
        //先创建一个二叉树,数组变为二叉树
        BinTree T = (BinTree)malloc(sizeof(TreeNode));
        T->data = a[i];
        T->left = T->right = nullptr;  
        Insert(tree, T);

    }
    


}
//递归查找 返回的是结点的指针 
BinTree find1(BinTree&tree, int x)
{
    if (tree == nullptr)
         return NULL;
    if (x > tree->data)
        return find1(tree->right, x);
    else if (x < tree->data)
        return find1(tree->left, x);
    else
        return tree;
}

//非递归查找
BinTree find2(BinTree&tree, int x)
{
    while (tree)
    {
        if (x > tree->data)
            tree = tree->right;
        else if (x < tree->data)
            tree = tree->left;
        else
            return tree;
    }
    return NULL;
}

//查找最大元素  最大的数字肯定在右子树的末尾,同理最小数在座左子树的末尾
int FindMax(BinTree&tree)
{
    if (tree == nullptr)
        return -1;
    while (tree->right)
        tree = tree->right;
    return tree->data;

}
// 非递归实现 查找二叉树最大数字
int FindMax1(BinTree&tree)
{
    if (tree == nullptr)
        return -1;
    if (!tree->right)
        return tree->data;
    else
        FindMax1(tree->right);

}

//非递归实现 查找二叉树最小数
BinTree FindMin(BinTree&tree)
{
    if (tree == nullptr)
        return NULL;
    if (!tree->left)
        return tree;
    else
        FindMin(tree->left);

}

//二叉树的插入
BinTree numberInsert(BinTree&T, int x)
{
    if (T == nullptr)
    {
        T = (BinTree)malloc(sizeof(TreeNode));
        T->data = x;
        T->left = T->right = nullptr;
    }
    else if (T->data > x)
        T->left = numberInsert(T->left, x);
    else if(T->data < x)
        T->right = numberInsert(T->right, x);
    return T;
}

// 二叉树删除
BinTree Delete(int x, BinTree&tree)
{
    BinTree T;
    if (tree == nullptr)
    {
        return nullptr;
        cout << "二叉树为空,不能删除" << endl;
    }
    else if (x < tree->data)
    {
        tree->left = Delete(x, tree->left);//左子树递归删除
    }
    else if (x > tree->data)
    {
        tree->right = Delete(x, tree->right);//右子树递归删除
    }
    else
    {
        if (tree->left&&tree->right)//被删除节点有左右连个子节点
        {
            T = FindMin(tree->right); //在右子树中找最小的元素填充删除节点
            tree->data = T->data;
            tree->right = Delete(tree->data, tree->right);//删除右子树中的最小元素
        }
        else  //删除的节点有一个或者无子节点
        {
            T = tree;
            if (!tree->left) //有右孩子或无子节点
            {
                tree = tree->right;
            }
            else if(!tree->right) //有左孩子或无子节点
                tree = tree->left;
            free(T);
        }
    }
    return tree;
}

void ProOrderTraverse(BinTree tree)
{
    if (tree == NULL)
        return;
    cout << tree->data << " ";
    ProOrderTraverse(tree->left);
    ProOrderTraverse(tree->right);
}
int main()
{
    int a[length] = {20,30,15,10,4,3,5,6,8,45};
    BinTree tree1;
    tree1 = nullptr;
    
    BuildBinTree( tree1,a);
    ProOrderTraverse(tree1);
    cout << endl;

    cout << find1(tree1, 6) << endl; //打印指针
    ProOrderTraverse(tree1);
    cout << endl;

    cout << find2(tree1, 45) << endl;
    ProOrderTraverse(tree1);
    cout << endl;

    //cout << FindMax(tree1) << endl;  //非递归实现
    //cout << FindMax1(tree1) << endl; //递归实现
    //ProOrderTraverse(tree1);
    //cout << endl;

    //Delete(4, tree1);
    //ProOrderTraverse(tree1);

    system("pause");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值