二叉搜索树的插入建立与结点删除

//二叉搜索树的删除
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *leftChild;
    struct Node *rightChild;
}Node;
void Build_tree(Node **root);
void Insert_tree(Node **root,Node *new_node);
void Traverse_tree(Node **root);
void Remove_tree(Node **root,int value);//删除结点
Node** min(Node **root);//右子树中寻找中序下的第一个结点
void Build_tree(Node **root)//建树
{
    int value;
    Node *new_node;
    *root=NULL;
    new_node=NULL;
    printf("请输入数据,以负数作为结束\n");
    scanf("%d",&value);
    while(value>0)
    {
        new_node=(Node*)malloc(sizeof(Node));
        new_node->data=value;
        new_node->leftChild=NULL;
        new_node->rightChild=NULL;
        Insert_tree(root,new_node);
        scanf("%d",&value);
    }
    printf("二叉搜索树构建完成\n");
}
void Traverse_tree(Node **root)//中序遍历
{
    if(*root!=NULL)
    {
        Traverse_tree(&((*root)->leftChild));
        printf("%d ",(*root)->data);
        Traverse_tree(&((*root)->rightChild));
    }
}
void Insert_tree(Node **root,Node *new_node)//向树中插入新节点
{
    if(*root==NULL)
    *root=new_node;
       else if(((*root)->data)>new_node->data)
       {
           Insert_tree(&((*root)->leftChild),new_node);
       }
       else if(((*root)->data)<new_node->data)
       {
           Insert_tree(&((*root)->rightChild),new_node);
       }
}
void Remove_tree(Node **root,int x)
{
    Node **temp;
    if(*root!=NULL)
       if(x<((*root)->data)) //要删除的节点在左子树中
          Remove_tree(&((*root)->leftChild),x);
       else if(x>((*root)->data)) //要删除的节点在右子树中
          Remove_tree(&((*root)->rightChild),x);
       else if(((*root)->leftChild)!=NULL&&((*root)->rightChild)!=NULL)//要删除的就是当前节点
       {//当前结点有左子树和右子树
           printf("*1");
           temp=min(&((*root)->rightChild));//获得右子树中的最小值
           (*root)->data=(*temp)->data;
           Remove_tree(&((*root)->rightChild),(*root)->data);
       }
       else
       {//当前节点只有一个子树或没有子树
           if((*root)->leftChild!=NULL)//当前节点没有左子树
             *root=(*root)->leftChild;
           else if((*root)->rightChild!=NULL)//当前节点没有右子树
             *root=(*root)->rightChild;
           else
             *root=NULL;
       }
     else
       printf("二叉搜索树是空树或要删除的数据不存在!");
}
Node** min(Node** root)
{
   // printf("+");
    while((*root)->leftChild!=NULL) root=&((*root)->leftChild);
    return root;
}
int main(int argc,char *argv[])
{
    Node **root;
    int value;
    Build_tree(root);
    printf("\n用插入法建树的遍历结果为:\n");
    Traverse_tree(root);
    printf("\n请输入要删除的数:\n");
    scanf("%d",&value);
    Remove_tree(root,value);
    printf("\n删除后的遍历结果为:\n");
    Traverse_tree(root);
    system("PAUSE");
    return 0;
}

试了好多次应该没错。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值