您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-06 17:30 513 查看
二叉查找树需要注意的是删除操作,网上很多实现有些问题,还是自己手工实现一遍

#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");

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息