复习数据结构之二叉查找树

13 篇文章 0 订阅
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>

typedef int dataType;
typedef struct node * BSTptr;
struct node
{
	dataType data;
	BSTptr lchild;
	BSTptr rchild;
};

BSTptr parent1;
BSTptr parent2;

void addNodeToBST(BSTptr *root, dataType key)
{
	BSTptr ptr;
	if(NULL == *root)
	{
		ptr = (BSTptr)malloc(sizeof(struct node));
		assert(ptr);
		ptr->data = key;
		ptr->lchild = ptr->rchild = NULL;
		(*root) = ptr;
	}
	else if((*root)->data > key)
	{
		addNodeToBST(&((*root)->lchild), key);
	}
	else if((*root)->data < key)
	{
		addNodeToBST(&((*root)->rchild), key);
	}
	else 
	{
		printf("the key exists");
		return;
	}
}

void preorder(const BSTptr root)
{
	if(NULL != root)
	{
		printf("%d\n", root->data);
		preorder(root->lchild);
		preorder(root->rchild);
	}
}

void inorder(const BSTptr root)
{
	if(NULL != root)
	{
		inorder(root->lchild);
		printf("%d\n", root->data);
		inorder(root->rchild);
	}
}

void postorder(const BSTptr root)
{
	if(NULL != root)
	{
		postorder(root->lchild);
		postorder(root->rchild);
		printf("%d\n", root->data);
	}
}

BSTptr maxNode(BSTptr tree)
{
    while(tree->rchild)
    {
        parent1 = tree;
		tree =  tree->rchild;
    }
    return tree;
}

BSTptr minNode(BSTptr tree)
{
	while(tree->lchild)
    {
        parent1 = tree;
		tree =  tree->lchild;
    }
    return tree;
}

BSTptr search(BSTptr tree, dataType key)
{
    while(tree)
    {
        if(tree->data == key)
        {
            return tree;
        }
        else if(tree->data > key)
        {
            tree = tree->lchild;
        }
        else
        {
            tree = tree->rchild;
        }
    }
    return NULL;
}
void deleteNode(BSTptr *tree, dataType key)
{
    BSTptr node;
    node = search(*tree, key);
    if(NULL == node)
    {
        printf("there is no key in the tree!\n");
        exit(1);
    }
	if(!(node->lchild) && !(node->rchild))
	{
		free(node);
		node = NULL;
	}
    else if(node->lchild && !(node->rchild))
    {
        node->data = node->lchild->data;
		free(node->lchild);
		node->lchild = NULL;
    }
    else if(node->rchild && !(node->lchild))
    {
        node->data = node->rchild->data;
		free(node->rchild);
		node->rchild = NULL;
    }
    else
    {
        BSTptr tmp = NULL;
        tmp = maxNode(node->lchild);
        node->data = tmp->data;
		if(!(tmp->lchild) && !(tmp->rchild))
		{
			free(tmp);
			tmp = NULL;
		}
        else if(tmp->lchild && !(tmp->rchild))
        {
            tmp->data = tmp->lchild->data;
			free(tmp->lchild);
			tmp->lchild = NULL;
        }
         else if(tmp->rchild && !(tmp->lchild))
        {
            tmp->data = tmp->rchild->data;
			free(tmp->rchild);
			tmp->rchild = NULL;
        } 
    }
}

int main(void)
{
	BSTptr tree = NULL;
	BSTptr node;
	addNodeToBST(&tree, 10);
	addNodeToBST(&tree, 6);
	addNodeToBST(&tree, 4);
	addNodeToBST(&tree, 8);
	addNodeToBST(&tree, 14);
	addNodeToBST(&tree, 12);
	addNodeToBST(&tree, 16);
	preorder(tree);
	printf("\n");
	inorder(tree);
	printf("\n");
	postorder(tree);
	printf("\n");
	deleteNode(&tree, 14);
	preorder(tree);
	printf("\n");
	inorder(tree);
	printf("\n");
	postorder(tree);
	//node = search(tree, 8);
	//printf("\n%d\n", node->data);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值