二叉查找树之创建,遍历,删除
2012-09-26 21:31
274 查看
/* 二叉查找树 数据结构定义 */
typedef struct BSTreeNode
{
int data ;
struct BSTreeNode *lchild ;
struct BSTreeNode *rchild ;
}BSTreeNode ;
/* 插入 */
void InsertBST( BSTreeNode* &t, int key )
{
if( NULL == t )
{
t = ( BSTreeNode * )malloc( sizeof(BSTreeNode) ) ;
t->lchild = NULL ;
t->rchild = NULL ;
t->data = key ;
return ;
}
if( key < t->data )
InsertBST( t->lchild, key ) ;
else
InsertBST( t->rchild, key ) ;
}
/*中序遍历*/
void InOrderPrintf( BSTreeNode* node)
{
if(node != NULL)
{
InOrderPrintf(node->lchild);
printf(" %d ", node->data);
InOrderPrintf(node->rchild);
}
}
/*前序遍历*/
void PreOrderPrintf( BSTreeNode* node )
{
if( node != NULL )
{
printf( " %d ", node->data ) ;
PreOrderPrintf( node->lchild ) ;
PreOrderPrintf( node->rchild ) ;
}
}
/*后序遍历*/
void PostOrderPrintf( BSTreeNode* node )
{
if( node != NULL )
{
PostOrderPrintf( node->lchild ) ;
PostOrderPrintf( node->rchild ) ;
printf( " %d ", node->data ) ;
}
}
/*查找某个值key*/
BSTreeNode* BST_Search( BSTreeNode *t, int key )
{
if( t == NULL )
return NULL ;
else
{
if( key == t->data )
return t ;
else if( key < t->data )
return ( BST_Search( t->lchild, key ) ) ;
else
return ( BST_Search( t->rchild, key ) ) ;
}
}
/*删除某个节点key*/
void Delete_BST( BSTreeNode *t, int key )
{
BSTreeNode *p = t ;
BSTreeNode *f = NULL ;
BSTreeNode *q, *s ;
while( p!=NULL && p->data!=key )
{
f = p ;
if( p->data > key )
p = p->lchild ;
else
p = p->rchild ;
}
if( NULL == p )
return ;
s = p ;
if( p->lchild!=NULL && p->rchild!=NULL )
{
f = p ;
s = p->lchild ;
while( s->rchild != NULL )
{
f = s ;
s = s->rchild ;
}
p->data = s->data ;
}
if( s->lchild != NULL )
q = s->lchild ;
else
q = s->rchild ;
if( NULL == f )
t = q ;
else if( f->lchild == s )
f->lchild = q ;
else
f->rchild = q ;
free( s ) ;
}
typedef struct BSTreeNode
{
int data ;
struct BSTreeNode *lchild ;
struct BSTreeNode *rchild ;
}BSTreeNode ;
/* 插入 */
void InsertBST( BSTreeNode* &t, int key )
{
if( NULL == t )
{
t = ( BSTreeNode * )malloc( sizeof(BSTreeNode) ) ;
t->lchild = NULL ;
t->rchild = NULL ;
t->data = key ;
return ;
}
if( key < t->data )
InsertBST( t->lchild, key ) ;
else
InsertBST( t->rchild, key ) ;
}
/*中序遍历*/
void InOrderPrintf( BSTreeNode* node)
{
if(node != NULL)
{
InOrderPrintf(node->lchild);
printf(" %d ", node->data);
InOrderPrintf(node->rchild);
}
}
/*前序遍历*/
void PreOrderPrintf( BSTreeNode* node )
{
if( node != NULL )
{
printf( " %d ", node->data ) ;
PreOrderPrintf( node->lchild ) ;
PreOrderPrintf( node->rchild ) ;
}
}
/*后序遍历*/
void PostOrderPrintf( BSTreeNode* node )
{
if( node != NULL )
{
PostOrderPrintf( node->lchild ) ;
PostOrderPrintf( node->rchild ) ;
printf( " %d ", node->data ) ;
}
}
/*查找某个值key*/
BSTreeNode* BST_Search( BSTreeNode *t, int key )
{
if( t == NULL )
return NULL ;
else
{
if( key == t->data )
return t ;
else if( key < t->data )
return ( BST_Search( t->lchild, key ) ) ;
else
return ( BST_Search( t->rchild, key ) ) ;
}
}
/*删除某个节点key*/
void Delete_BST( BSTreeNode *t, int key )
{
BSTreeNode *p = t ;
BSTreeNode *f = NULL ;
BSTreeNode *q, *s ;
while( p!=NULL && p->data!=key )
{
f = p ;
if( p->data > key )
p = p->lchild ;
else
p = p->rchild ;
}
if( NULL == p )
return ;
s = p ;
if( p->lchild!=NULL && p->rchild!=NULL )
{
f = p ;
s = p->lchild ;
while( s->rchild != NULL )
{
f = s ;
s = s->rchild ;
}
p->data = s->data ;
}
if( s->lchild != NULL )
q = s->lchild ;
else
q = s->rchild ;
if( NULL == f )
t = q ;
else if( f->lchild == s )
f->lchild = q ;
else
f->rchild = q ;
free( s ) ;
}
相关文章推荐
- Java实现二叉查找树的创建、查找、插入、删除、遍历
- 03链表的创建、插入、删除、遍历、排序
- 单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并
- python的【字典dict】:创建、访问、更新、删除;查看键、值、键值对;遍历;排序
- 数据结构—链表的定义、创建、遍历、插入、删除
- 单链表的创建、遍历、插入、删除、查找、逆转
- python 学习记录(11)-文件处理/读取文件/文件写入内容/文件删除/文件复制/文件重命名/后缀名/内容查找与替换/文件比较/ 配置文件访问/目录创建与删除/遍历目录/定向输出
- 数据结构C#实现-二叉查找树的创建,查找,以及各种递归(非递归)遍历算法
- 【C/C++】文件夹的打开、遍历、删除、创建、关闭操作汇总
- 二叉查找树原理分析及查找、插入、删除、遍历实现
- c++实现单链表创建,删除,遍历,插入,修改操作
- 单链表的创建和遍历、求单链表中节点的个数、查找单链表中的中间结点、判断单链表是否有环、取出有环链表中环的长度,删除有序链表中的重复结点
- JAVA基础初探(十二)Map接口及其常用实现类(HashMap)、File类详解(概述、创建、删除、重命名、文件属性读取/设置、遍历文件夹)
- 初识go语言之 数组与切片(创建,遍历,删除,插入,复制)
- 二叉查找树(BST)---创建 清空 遍历
- 二叉排序数(创建,插入,删除,查找及前序、中序、后序遍历)
- Go语言字典(map)用法实例分析【创建,填充,遍历,查找,修改,删除】
- 二叉查找树(二叉排序树)创建、插入、删除、查找-C语言
- 二叉树的创建和遍历、删除
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)