有序二叉树的实现

#include <stdio.h>
#include <stdlib.h>

struct Node;

typedef struct{
	struct Node *pnode;
}tree;

typedef struct Node{
	int data;
	tree left;
	tree right;
}node;

//树的初始化函数
void tree_init(tree *pt)
{
	pt->pnode = NULL;
}

//树的清理函数
void tree_delete(tree *pt)
{
	if(!(pt->pnode))
		return;
	tree_delete(&(pt->pnode->left));
	tree_delete(&(pt->pnode->right));
	free(pt->pnode);
	pt->pnode = NULL;
}

//统计有效节点个数
int tree_size(const tree *pt)
{
	int cnt = 0;
	if(!(pt->pnode))
		return 0;
	cnt = tree_size(&(pt->pnode->left));
	cnt += tree_size(&(pt->pnode->right));
	return cnt + 1;
}

//在有序二叉树里查找某个数字所在位置的函数
tree *tree_search(const tree *pt, int val)
{
	if(!(pt->pnode)){
		return (tree *)pt;
	}
	if(pt->pnode->data == val){
		return (tree *)pt;
	}
	else if(pt->pnode->data > val){
		return tree_search(&(pt->pnode->left), val);
	}
	else{
		return tree_search(&(pt->pnode->right), val);
	}
}

//在有序二叉树里加入新节点的函数
int tree_insert(tree *pt, int val)
{
	node *new = NULL;
	tree *tmp = tree_search(pt, val);
	if(tmp->pnode){
		return 0;
	}
	new = (node *)malloc(sizeof(node));
	if(!new){
		return 0;
	}
	new->data = val;
	new->left.pnode = NULL;
	new->right.pnode = NULL;

	tmp->pnode = new;
	return 1;
}

//以中序遍历方式处理有序二叉树里所有节点的函数
void tree_miter(tree *pt, void (*func)(int))
{
	if(!(pt->pnode))
		return;
	tree_miter(&(pt->pnode->left), func);
	func(pt->pnode->data);
	tree_miter(&(pt->pnode->right), func);
}

//删除某个数字所在节点的函数
int tree_remove(tree *pt, int val)
{
	node *rem = NULL;
	tree *tmp = tree_search(pt, val);
	if(!(tmp->pnode)){
		return 0;
	}

	rem = tmp->pnode;
	if(!(rem->left.pnode) && !(rem->right.pnode)){
		//没有子节点
		tmp->pnode = NULL;
	}
	else if(!(rem->left.pnode)){
		//只有右子树存在
		tmp->pnode = rem->right.pnode;
	}
	else if(!(rem->right.pnode)){
		//只有左子树存在
		tmp->pnode = rem->left.pnode;
	}
	else{
		//左右子树都存在
		tree *tmp1 = tree_search(&(rem->left), rem->right.pnode->data);
		tmp1->pnode = rem->right.pnode;
		tmp->pnode = rem->left.pnode;
	}
	free(rem);
	rem = NULL;
	return 1;
}

void print_cb(int val)
{
	printf("%d ", val);
}

int main()
{
	tree tr = {0};
	tree_init(&tr);
	tree_insert(&tr, 50);
	tree_insert(&tr, 30);
	tree_insert(&tr, 70);
	tree_insert(&tr, 20);
	tree_insert(&tr, 40);
	tree_insert(&tr, 60);
	tree_insert(&tr, 80);
	tree_insert(&tr, 45);
	tree_insert(&tr, 65);
	tree_remove(&tr, 30);
	printf("size=%d\n", tree_size(&tr));
	tree_miter(&tr, print_cb);
	printf("\n");
	tree_delete(&tr);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值