数据结构与算法-第六章树

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;	
}

你可能感兴趣的:(数据结构与算法,数据结构)