数据结构与算法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");
}
#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");
}
相关文章推荐
- 设计一个算法,找出二叉树中某两个结点的第一个公共祖先.。不得将额外的结点存储在另外的数据结构中。注意:这不一定是二叉查找树。
- 数据结构和算法 – 9.二叉树和二叉查找树
- 二叉排序树(二叉查找树)- 数据结构和算法73
- 每周数据结构【3】:设计一个非递归的算法求二叉树高度
- 二叉树的构建,线索化,以及线索二叉树的遍历c++语言表示(《数据结构》算法6.5,6.6,6.7)
- 面经 常见数据结构的算法 - 二叉树
- 【算法与数据结构】二叉树的 中序 遍历
- *第十一周*数据结构实践项目一【二叉树的层次遍历算法】
- 数据结构--二叉树--求树的深度的算法(树遍历算法的应用)
- 二叉树的存储结构 - 数据结构和算法45
- 数据结构_二叉树_遍历算法应用
- 《 常见算法与数据结构》符号表ST(4)——二叉查找树删除 (附动画)
- 数据结构-二叉树和二叉查找树
- [算法与数据结构] - No.7 二叉树建立及其前序、中序、后序遍历
- 【算法和数据结构】二叉树的定义和封装(C++实现)
- [算法]二叉树基础与二叉查找树与堆
- 微软等数据结构+算法面试100题(20)--二叉树公共父节点
- 微软等数据结构+算法面试100题(35)-- 二叉树的深度
- 二叉树的存储结构 - 数据结构和算法45
- 算法与数据结构-二叉树 讲解与java代码实现