数据结构与算法4:二叉树1(二叉查找树)

来源:互联网 发布:修改域名dns 编辑:程序博客网 时间:2024/05/16 11:20

二叉查找树需要注意的是删除操作,网上很多实现有些问题,还是自己手工实现一遍

#include <stdio.h>#include <stdlib.h>typedef int Type;typedef struct tag_BSTNode{    Type key;    struct tag_BSTNode *left;    struct tag_BSTNode *right;} BSTNode,*BSTree;BSTNode* bst_search1(BSTree root, Type key){    if (root == NULL || root->key==key)        return root;    if (key < root->key)        return bst_search1(root->left, key);    else        return bst_search1(root->right, key);}BSTNode* bst_search2(BSTree root, Type key){       while ((key != root->key) && (root != NULL))    {        if (key < root->key)        {            root = root->left;        }        else        {            root = root->right;        }    }        return root;}BSTNode *bst_adddata(BSTree root, Type key){       BSTNode *tmp;        if (NULL == root)    {        root = (BSTNode *) malloc(sizeof(BSTNode));        root->key = key;        root->left = NULL;        root->right = NULL;    }    else    {        tmp = root;        while (tmp != NULL)        {            if (key < tmp->key)            {                if (NULL != tmp->left)                {                    tmp = tmp->left;                }                else                {                   tmp->left = (BSTNode *) malloc(sizeof(BSTNode));                   tmp->left->left = NULL;                   tmp->left->right = NULL;                   tmp->left->key = key;                   break;                }                            }            else            {                if (NULL != tmp->right)                {                    tmp = tmp->right;                }                else                {                    tmp->right = (BSTNode *) malloc(sizeof(BSTNode));                    tmp->right->left = NULL;                    tmp->right->right = NULL;                    tmp->right->key = key;                    break;                }                            }        }       }        return root;}BSTNode *bst_deldata(BSTree root, Type key){       BSTNode *tmp = root;    BSTNode *parent = NULL;    BSTNode *prenode = NULL;    BSTNode *prenode_parent = NULL;        while (tmp != NULL)    {        if (key < tmp->key)        {            parent = tmp;            tmp = tmp->left;        }        else if(key > tmp->key)        {            parent = tmp;            tmp = tmp->right;        }        else        {            break;        }    }        if (NULL == tmp)    {        return root;    }        if ((NULL == tmp->right) && (NULL == tmp->left))    {        if (parent != NULL)        {            if (parent->right == tmp)            {                parent->right = NULL;                free(tmp);            }            else            {                parent->left = NULL;                free(tmp);            }        }        else         {            root = NULL;        }    }    else if (NULL == tmp->right)    {        if (parent != NULL)        {            if (parent->right == tmp)            {                parent->right = tmp->left;                free(tmp);            }            else            {                parent->left = tmp->left;                free(tmp);            }        }         else        {            root = tmp->left;            free(tmp);        }    }    else if (NULL == tmp->left)    {        if (parent != NULL)        {            if (parent->right == tmp)            {                parent->right = tmp->right;                free(tmp);            }            else            {                parent->left = tmp->right;                free(tmp);            }        }         else        {            root = tmp->right;            free(tmp);        }    }    else    {        parent = tmp;        prenode = tmp->left;        while (NULL != prenode->right)        {            prenode_parent = prenode;            prenode = prenode->right;        }                tmp->key = prenode->key;                if (prenode == tmp->left)        {            tmp->left = prenode->left;        }        else        {            prenode_parent->right = prenode->left;        }                free(prenode);    }        return root;}void preorder_bstree(BSTree root){    if(root != NULL)    {        printf("%d ", root->key);        preorder_bstree(root->left);        preorder_bstree(root->right);    }}void inorder_bstree(BSTree root){    if(root != NULL)    {        inorder_bstree(root->left);        printf("%d ", root->key);        inorder_bstree(root->right);    }}void postorder_bstree(BSTree root){    if(root != NULL)    {        postorder_bstree(root->left);        postorder_bstree(root->right);        printf("%d ", root->key);    }    }BSTNode *bst_max(BSTree root){    while(NULL != root)    {        if (NULL != root->right)        {            root = root->right;        }        else        {            break;        }    }        return root;}BSTNode *bst_min(BSTree root){    while(NULL != root)    {        if (NULL != root->left)        {            root = root->left;        }        else        {            break;        }    }        return root;}int main(){    Type data[] = {1,2,3,4,5,6,7,8,9,10};    Type data2[] = {5,4,3,2,1,6,7,8,9,10};    BSTree root = NULL;    int i;        for(i = 0; i < 10; i++)    {        root = bst_adddata(root, data[i]);    }        preorder_bstree(root);    printf("\n");    inorder_bstree(root);    printf("\n");    postorder_bstree(root);    printf("\n");    printf("\n");        for(i = 0; i < 10; i++)    {        root = bst_deldata(root, data[i]);        preorder_bstree(root);        printf("\n");    }        for(i = 0; i < 10; i++)    {        root = bst_adddata(root, data[i]);    }        for(i = 9; i >= 0; i--)    {        root = bst_deldata(root, data[i]);        preorder_bstree(root);        printf("\n");    }        for(i = 0; i < 10; i++)    {        root = bst_adddata(root, data2[i]);    }        preorder_bstree(root);    printf("\n");    inorder_bstree(root);    printf("\n");    postorder_bstree(root);    printf("\n");    printf("\n");        for(i = 0; i < 10; i++)    {        root = bst_deldata(root, data2[i]);        preorder_bstree(root);        printf("\n");    }        for(i = 0; i < 10; i++)    {        root = bst_adddata(root, data2[i]);    }        root = bst_deldata(root, data2[3]);    inorder_bstree(root);    printf("\n");        root = bst_adddata(root, data2[3]);    inorder_bstree(root);    printf("\n");        root = bst_deldata(root, data2[3]);    inorder_bstree(root);    printf("\n");        }