二叉搜索树:创建、插入、查找、遍历,删除(有点儿问题)

/*=============================================
针对二叉搜素树
=============================================*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdint.h>

typedef struct treeNode *Tree;
struct treeNode
{
	int data;
	Tree lchild;
	Tree rchild;
};

static Tree create_tree(int value)
{// 创建单个节点
	Tree tree = malloc(sizeof(Tree));
	if (tree)
	{
		tree->data = value;
		tree->lchild = NULL;
		tree->rchild = NULL;
		return tree;
	}
	else
		return NULL;
}

static void insert_tree(Tree tree, int in_value)
{// 平衡二叉树插入节点
	Tree node;
	Tree father_node = tree;
	Tree child_node=tree;
	int right_ro_left = 0;
	while (child_node)
	{
		father_node = child_node;
		if (father_node->data < in_value){
			child_node = father_node->rchild;
			right_ro_left = 1;
		}
		if (father_node->data > in_value){
			child_node = father_node->lchild;
			right_ro_left = 2;
		}
	}

	node = create_tree(in_value);
	if (right_ro_left == 1)
		father_node->rchild = node;
	else if (right_ro_left == 2)
		father_node->lchild = node;
}

static void traverse_tree_pro(Tree tree)
{// 前序遍历树
	if (tree)
	{
		printf("%d ", tree->data);
		traverse_tree_pro(tree->lchild);
		traverse_tree_pro(tree->rchild);
	}
}

static void traverse_tree_after(Tree tree)
{// 后序遍历树
	if (tree)
	{
		traverse_tree_after(tree->lchild);
		traverse_tree_after(tree->rchild);
		printf("%d ", tree->data);
	}
}

static void traverse_tree_middle(Tree tree)
{// 中序遍历树
	if (tree)
	{
		traverse_tree_middle(tree->lchild);
		printf("%d ", tree->data);
		traverse_tree_middle(tree->rchild);
	}
}

static Tree find_tree_min(Tree tree)
{//二叉搜索树查找最小值:循环,最小值一定在最左边
	if (tree)
	{
		while (tree->lchild)
		{
			tree = tree->lchild;
		}
	}

	return tree;
}

static Tree find_tree_max(Tree tree)
{//二叉搜索树查找最大值:循环,最大值一定在最左边
	if (tree)
	{
		while (tree->rchild)
		{
			tree = tree->rchild;
		}
	}

	return tree;
}

static Tree delete_tree(Tree tree, int value)
{// 删除给定值的节点
	Tree tmp;
	if (!tree)
		printf("not found need delete one!");
	else if (value < tree->data)
		tree->lchild = delete_tree(tree, value); // 左子树递归删除
	else if (value > tree->data)
		tree->rchild = delete_tree(tree, value); // 右子树递归删除
	else
	{// 找到要删除的节点
		if (tree->lchild && tree->rchild) // 被删除的节点有左右两个子节点
		{
			tmp = find_tree_min(tree->rchild);// 在右子树中找最小的元素填充删除节点
			tree->data = tmp->data;
			tree->rchild = delete_tree(tree->rchild, tmp->data);// 在删除的节点
		}
		else
		{// 被删除节点有一个或者没有子节点
			tmp = tree;
			if (!tree->lchild && tree->rchild) // 有右孩子或无子节点
				tree = tree->rchild;
			else if (!tree->rchild && tree->lchild) // 有左孩子或者无子节点
				tree = tree->lchild;
			free(tree);
		}
	}

	return tree;
}

int main()
{
	Tree tree,tmp;
	tree = create_tree(10);
	insert_tree(tree, 12);
	insert_tree(tree, 11);
	insert_tree(tree, 19);
	insert_tree(tree, 8);
	insert_tree(tree, 9);
	insert_tree(tree, 7);
	insert_tree(tree, 6);
	insert_tree(tree, 15);
	insert_tree(tree, 14);

	traverse_tree_pro(tree);
	printf("\n");

	traverse_tree_after(tree);
	printf("\n");

	traverse_tree_middle(tree);
	printf("\n");


	//delete_tree(tree,11);

	//traverse_tree_pro(tree);

	system("pause");
	return 9;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值