bi_search_tree.c
2010-09-15 22:33
260 查看
#include <stdio.h>
#include <stdlib.h>
#include "bi_search_tree.h"
/*插入操作,value是待插入的值*/
bst_tree *bst_insert(bst_tree *root, datatype value)
{
bst_tree *parent, *node, *child;
/*树为空,创建根节点*/
if(root == NULL)
{
root = (bst_tree *)malloc(sizeof(bst_tree));
root->key = value;
root->left = NULL;
root->right = NULL;
return root;
}
parent = root; /*记录下根节点的位置*/
node = root;
while(node != NULL)
{
/*待插入数据已经存在,则返回*/
if(node->key == value)
return root;
else
{
parent = node;
/*若小于节点的值,则查看节点的左孩子,否则,查看右孩子*/
if(node->key < value)
node = node->right;
else
node = node->left;
}
}
child = (bst_tree *)malloc(sizeof(bst_tree));
child->key = value;
child->left = NULL;
child->right = NULL;
if(value > parent->key)
parent->right = child;
else
parent->left = child;
return root;
}
/*查找,找到返回1,否则,返回0*/
int bst_search(bst_tree *root, datatype value)
{
bst_tree *p;
p = root;
if(p == NULL)
return 0;
if(p->key == value)
return 1;
else if(p->key > value)
return bst_search(p->left, value);
else
return bst_search(p->right, value);
}
/*删除节点值为value的节点*/
int bst_delete(bst_tree *root, datatype value)
{
bst_tree *p, *pre=NULL, *mid;
p = root;
if(root == NULL)
return 0;
/*找到该节点*/
while((p != NULL) && (p->key != value))
{
pre = p;
if(p->key < value)
{
p = p->right;
}
else
p = p->left;
}
if(p == NULL)
return 0;
/*至少有一个子节点为空*/
if( (p->left == NULL) || (p->right == NULL) )
{
if( pre->left == p )
{
pre->left = ( (p->left == NULL) ? p->right : p->left );
}
else
pre->right = ( (p->left == NULL) ? p->right : p->left );
free(p); /*释放节点*/
}
else
{
/*删除的节点有2个子女*/
mid = p->right;
pre = p;
/*寻找中序的第一个节点*/
while(mid->left != NULL)
{
pre = mid;
mid = mid->left;
}
/*移花接木,直接赋值,避免交换节点*/
p->key = mid->key;
/*将mid节点的子节点作为pre的子节点,并将mid所指向的节点删除*/
if(pre->right == mid)
pre->right = mid->right;
else
pre->left = mid->right;
free(mid);
}
return 1;
}
/*中序输出bst树*/
void bst_print(bst_tree *root)
{
if(root == NULL)
return;
bst_print(root->left);
printf(" %d ", root->key);
bst_print(root->right);
}
#include <stdlib.h>
#include "bi_search_tree.h"
/*插入操作,value是待插入的值*/
bst_tree *bst_insert(bst_tree *root, datatype value)
{
bst_tree *parent, *node, *child;
/*树为空,创建根节点*/
if(root == NULL)
{
root = (bst_tree *)malloc(sizeof(bst_tree));
root->key = value;
root->left = NULL;
root->right = NULL;
return root;
}
parent = root; /*记录下根节点的位置*/
node = root;
while(node != NULL)
{
/*待插入数据已经存在,则返回*/
if(node->key == value)
return root;
else
{
parent = node;
/*若小于节点的值,则查看节点的左孩子,否则,查看右孩子*/
if(node->key < value)
node = node->right;
else
node = node->left;
}
}
child = (bst_tree *)malloc(sizeof(bst_tree));
child->key = value;
child->left = NULL;
child->right = NULL;
if(value > parent->key)
parent->right = child;
else
parent->left = child;
return root;
}
/*查找,找到返回1,否则,返回0*/
int bst_search(bst_tree *root, datatype value)
{
bst_tree *p;
p = root;
if(p == NULL)
return 0;
if(p->key == value)
return 1;
else if(p->key > value)
return bst_search(p->left, value);
else
return bst_search(p->right, value);
}
/*删除节点值为value的节点*/
int bst_delete(bst_tree *root, datatype value)
{
bst_tree *p, *pre=NULL, *mid;
p = root;
if(root == NULL)
return 0;
/*找到该节点*/
while((p != NULL) && (p->key != value))
{
pre = p;
if(p->key < value)
{
p = p->right;
}
else
p = p->left;
}
if(p == NULL)
return 0;
/*至少有一个子节点为空*/
if( (p->left == NULL) || (p->right == NULL) )
{
if( pre->left == p )
{
pre->left = ( (p->left == NULL) ? p->right : p->left );
}
else
pre->right = ( (p->left == NULL) ? p->right : p->left );
free(p); /*释放节点*/
}
else
{
/*删除的节点有2个子女*/
mid = p->right;
pre = p;
/*寻找中序的第一个节点*/
while(mid->left != NULL)
{
pre = mid;
mid = mid->left;
}
/*移花接木,直接赋值,避免交换节点*/
p->key = mid->key;
/*将mid节点的子节点作为pre的子节点,并将mid所指向的节点删除*/
if(pre->right == mid)
pre->right = mid->right;
else
pre->left = mid->right;
free(mid);
}
return 1;
}
/*中序输出bst树*/
void bst_print(bst_tree *root)
{
if(root == NULL)
return;
bst_print(root->left);
printf(" %d ", root->key);
bst_print(root->right);
}
相关文章推荐
- bi_search_tree.h
- Lowest Common Ancestor of a Binary Search Tree
- [LeetCode] Convert Sorted Array to Binary Search Tree, Solution
- LeetCode Covert Sorted List to Binary Search Tree
- Validate Binary Search Tree
- uva_10304 - Optimal Binary Search Tree(最优搜索二叉树)
- Binary Search Tree Iterator
- Leetcode 272. Closest Binary Search Tree Value II (Hard) (cpp)
- Convert Binary Search Tree to Doubly Linked List
- 99. Recover Binary Search Tree
- LeetCode108. Convert Sorted Array to Binary Search Tree
- leetcode之Lowest Common Ancestor of a Binary Search Tree
- [Leetcode] Recover Binary Search Tree
- 【leetcode】Recover Binary Search Tree
- leetcode-108. Convert Sorted Array to Binary Search Tree
- Leetcode:Recover Binary Search Tree
- [Leetcode] Validate binary search tree 验证二叉搜索树
- [LeetCode] Recover Binary Search Tree 解题报告
- LeetCode: Validata Binary Search Tree
- LeetCode – Refresh – Valid Binary Search Tree