排序二叉树【BST】的创建.先序遍历.中序遍历.节点的加入和删除

解决思路:

1:将给定的数据进行数据元素的冒泡排序操作,用来判定将要执行BST 操作的数组中的数据是否满足BST树的基本的数据的要求,满足时再指向BST输的创建过程,不满足的时候,报错【“不满足BST对数据不一致的要求\n”】 ;

 2:创建BST,此处采用的创建方式是采用的二级指针的创建方式【传入二级指针,用于建立BST树的树根,同时利于后序的删除操作】,在创建的时候,根据BST树的创建规则将一次加载到书中,加载的规则是,如果数据的数值大于当前节点的值,就沿着BST的right_child向下查找,如果小于当前的节点数据的时候就沿着左边的节点向下查找,知道达到叶子节点的时候,将数据加载到也直接点的相应的位置【如果数据大于叶子节点的值,将新来的节点加载到叶子节点的右侧,反之,加载到叶子节点的左侧】; 

3:BST的遍历方式此处采用的是递归遍历先序和后序遍历的方式:

      先序:根--------左--------右

      中序:左--------根--------右

4:BST中的节点的删除:首先利用函数find找到所需要删除的节点的相对位置【利用与创建过程相类似的方式去遍历BST,找到所需要删除的节点和该节点的父亲节点】 ;

       第一步:删除的时候首先考虑到的是所需要删除的节点是不是含有两个子节点【left_child  right_child】,如果存在,就找到所需要删除的节点的左子树的最右下的节点【这个节点的数值是左子树中的数据最大的节点,同时有小于右边子树中的任何节点的数值】,用找到的节点的数据替换当前所需要删除的节点的数据 ,打到家删除的效果,再讲找到的节点删除;

       第二步:此时需要考虑的是所需要删除的节点是不是根节点,如果是根节点的话,就用根节点的左子树的根节点作为新的BST的根节点,如果不存在就用有节点作为新的根节点。 

       第三步:在删除操作结束以后需要求及相应的节点进行更新,用父亲节点和删除的节点来判定当前的节点是父亲节点的left_child还是right_child,如果是left_child就用删除的节点的左孩子来作新的父亲节点的左孩子,如果不存在就用right_child作为父亲节点的left_child,如果删除的节点是父亲节点的right_child,操作同删除父亲节点的left_child的操作步骤。 

 #include

#include

typedef struct node{
    int value;
    struct node *left_child;
    struct node *right_child;
}BST;

void insert_node(BST **root,int date){
    BST *temp=NULL;
    temp=(BST *)malloc(sizeof(BST));
    temp->value=date;
    temp->left_child=NULL;
    temp->right_child=NULL;
    
    if(*root==NULL){
        *root=temp;
        return ;
    }
    
    BST *mark=NULL;
    mark=*root;
    while(mark){
        if(mark->value             if(mark->right_child==NULL){
                mark->right_child=temp;
                return ;
            }
            mark=mark->right_child;
        }
        else if(mark->value>date){
            if(mark->left_child==NULL){
                mark->left_child=temp;
                return ;    
            }
            mark=mark->left_child;
        }
        else{
            printf("error\n");
            free(temp);
            temp=NULL;
            return ;
        }
    }

}

void create(BST **root,int a[],int length){
    if(a==NULL || length<=0)  return ;
    int i;
    int j;
    int temp;
    for(i=0;i         for(j=0;j             if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    for(i=1;i         if(a[i]==a[i-1]){
            printf("不满足BST对数据不一致的要求\n");
            return ;
        }
    }
    for(i=0;i         insert_node(root,a[i]);
    }
}

void q_traver(BST *root){
    if(root==NULL)  return ;
    printf("%d ",root->value);
    q_traver(root->left_child);
    q_traver(root->right_child);
}

void z_traver(BST *root){
    if(root==NULL)  return ;
    z_traver(root->left_child);
    printf("%d ",root->value);
    z_traver(root->right_child);

void find(BST *root,BST **del,BST **father,int find_date){
    while(root){
        if(root->value==find_date){
            *del=root;
            return ;
        }
        else if(root->value             *father=root;
            root=root->right_child;
        }
        else{
            *father=root;
            root=root->left_child;
        }
    }
    *father=NULL;
    printf("error\n");
}

void del_node(BST ** root,int del_date){
    if(*root==NULL)  return ;
    BST *del=NULL;
    BST *father=NULL;
    find(*root,&del,&father,del_date);
    if(del==NULL)  return ;
    
    if(del->left_child!=NULL && del->right_child!=NULL){
        BST *mark=NULL;
        mark=del;
        father=del;
        del=del->left_child;
        while(del->right_child){
            father=del;
            del=del->right_child;
        }
        mark->value=del->value;
    }

    if(father==NULL){
        *root=del->left_child?del->left_child:del->right_child;
        free(del);
        del=NULL;
        return ;
    }

    if(del==father->left_child){
        father->left_child=del->left_child?del->left_child:del->right_child;
    }    
    else{
        father->right_child=del->left_child?del->left_child:del->right_child;
    }
    
    free(del);
    del=NULL;
}

int main(){
    int a[]={10,5,6,4,455,9};
    BST *root=NULL;
    create(&root,a,sizeof(a)/sizeof(a[0]));
    q_traver(root);
    printf("\n-----------------------\n");
    z_traver(root);
    printf("\n-----------------------\n");
    del_node(&root,5);
    q_traver(root);
    printf("\n-----------------------\n");
    z_traver(root);
    printf("\n-----------------------\n");
    return 0;
}

 

 

你可能感兴趣的:(排序二叉树【BST】的创建.先序遍历.中序遍历.节点的加入和删除)