Btree.h
#ifndef _BTREE_H__
#define _BTREE_H__
#include
#include
#include
typedef int T;
typedef struct TNode{
T data;
struct TNode *left;
struct TNode *right;
}TNode;
//二权树类型 struct TNode * 记录根节点的地址
typedef struct TNode * BTree;
//BTree tree = NULL; 根节点不存在(NULL) 即意味着该树为空
// insert(&tree,10);
bool isEmpty(BTree btree);
void insert(BTree *ptree,T data);
void midle(BTree btree);
void left(BTree btree);
void right(BTree btree);
void travel(BTree btree);
size_t size(BTree btree);
size_t hight(BTree btree);
void clear(BTree *ptree);
bool isExists(BTree btree,T data);
bool delete(BTree *ptree,T data);
#endif //_BTREE_H__
Btree.c
#include "btree.h"
//BTree tree = NULL; 根节点不存在(NULL) 即意味着该树为空
// insert(&tree,10);
bool isEmpty(BTree btree){
return btree == NULL;
}
//递归实现
/*
void insert(BTree *ptree,T data){
if(*ptree == NULL){
TNode * node = malloc(sizeof(TNode));
node->data = data;
node->left = NULL;
node->right = NULL;
*ptree = node;
return;
}
if(data < (*ptree)->data){
insert(&(*ptree)->left,data);//把数据插入到左子树中
}else{
insert(&(*ptree)->right,data);//插入到右子树中
}
}
*/
//递推实现
/*
void insert(BTree *ptree,T data){
if(*ptree == NULL){
TNode * node = malloc(sizeof(TNode));
node->data = data;
node->left = NULL;
node->right = NULL;
*ptree = node;
return;
}
TNode *node = *ptree;
TNode *parent = NULL;
bool isLeft = true;
while(node != NULL){
parent = node;
if(data < node->data){
node = node->left;
isLeft = true;
}else{
node = node->right;
isLeft = false;
}
}
node = malloc(sizeof(TNode));
node->data = data;
node->left = NULL;
node->right = NULL;
if(isLeft){
parent->left = node;
}else{
parent->right = node;
}
}
*/
//struct TNode **ptree
void insert(BTree *ptree,T data){
while(*ptree != NULL){
if(data < (*ptree)->data){
ptree = &(*ptree)->left;
}else{
ptree = &(*ptree)->right;
}
}
*ptree = malloc(sizeof(TNode));
(*ptree)->data = data;
(*ptree)->left = NULL;
(*ptree)->right = NULL;
}
size_t size(BTree btree){
if(btree == NULL){
return 0;
}
return size(btree->left)+size(btree->right)+1;
}
size_t hight(BTree btree){
if(btree == NULL){
return 0;
}
return (hight(btree->left)>hight(btree->right)?hight(btree->left):hight(btree->right)) + 1;
}
//递归实现
void midle(BTree btree){
if(btree == NULL){
return;
}
midle(btree->left);//遍历左子树
printf("%d ",btree->data);//输出根节点的元素
midle(btree->right);//遍历右子树
}
void left(BTree btree){
if(btree == NULL){
return;
}
printf("%d ",btree->data);
left(btree->left);
left(btree->right);
}
void right(BTree btree){
if(btree == NULL){
return;
}
right(btree->left);
right(btree->right);
printf("%d ",btree->data);
}
void travel(BTree btree){
midle(btree);
printf("\n");
}
void clear(BTree *ptree){
if(*ptree != NULL){
clear(&(*ptree)->left);
clear(&(*ptree)->right);
free(*ptree);
*ptree = NULL;
}
}
bool isExists(BTree btree,T data){
TNode *node = btree;
while(node != NULL){
if(data < node->data){
node = node->left;
}else if(data > node->data){
node = node->right;
}else{
return true;
}
}
return false;
}
/*
bool delete(BTree *ptree,T data){
if(*ptree == NULL){
return false;
}
if((*ptree)->data == data){
TNode *left = (*ptree)->left;
TNode *right = (*ptree)->right;
free(*ptree);
if(left != NULL){
*ptree = left;//上提左子树
//右子树放到左子树的最右边
if(right != NULL{
TNode **rightTree = &left->right;
while(*rightTree != NULL){
rightTree = &(*rightTree)->right;
}
*rightTree = right;
}
}else{
*ptree = right;
}
return true;
}
if(data < (*ptree)->data){
return delete(&(*ptree)->left,data);
}else{
return delete(&(*ptree)->right,data);
}
}
*/
bool delete(BTree *ptree,T data){
while(*ptree != NULL){
if((*ptree)->data == data){
TNode *left = (*ptree)->left;
TNode *right = (*ptree)->right;
free(*ptree);
if(left != NULL){
*ptree = left;
if(right!=NULL){
TNode **rightTree = &left->right;
while(*rightTree != NULL){
rightTree = &(*rightTree)->right;
}
*rightTree = right;
}
}else{
*ptree = right;
}
return true;
}
if(data < (*ptree)->data){
ptree = &(*ptree)->left;
}else{
ptree = &(*ptree)->right;
}
}
return false;
}
Test.c
#include "btree.h"
int main(){
BTree tree = NULL;
insert(&tree,10);
insert(&tree,20);
insert(&tree,5);
insert(&tree,15);
insert(&tree,17);
insert(&tree,10);
insert(&tree,3);
insert(&tree,22);
insert(&tree,18);
travel(tree);
printf("%u \n",size(tree));
printf("%u \n",hight(tree));
printf("%d \n",isExists(tree,3));
printf("%d \n",isExists(tree,23));
insert(&tree,25);
insert(&tree,1);
insert(&tree,19);
insert(&tree,21);
travel(tree);
delete(&tree,17);
travel(tree);
delete(&tree,28);
travel(tree);
delete(&tree,10);
travel(tree);
delete(&tree,1);
travel(tree);
delete(&tree,25);
travel(tree);
delete(&tree,0);
travel(tree);
clear(&tree);
printf("%d \n",isEmpty(tree));
return 0;
}