C语言实现二进制搜索树

电脑杂谈  发布时间:2020-06-20 22:14:02  来源:网络整理

二叉排序树c语言_c语言二叉树遍历算法_二叉树的遍历c语言

6-12个二叉搜索树操作集(30个点)

此问题需要对给定的二叉搜索树进行五种常见操作.

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

c语言二叉树遍历算法_二叉排序树c语言_二叉树的遍历c语言

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT );  /* 中序遍历,由裁判实现,细节不表 */
BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );
int main()
{
    BinTree BST, MinP, MaxP, Tmp;
    ElementType X;
    int N, i;
    BST = NULL;
    scanf("%d", &N);
    for ( i=0; i<N; i++ ) {
        scanf("%d", &X);
        BST = Insert(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");
    MinP = FindMin(BST);
    MaxP = FindMax(BST);
    scanf("%d", &N);
    for( i=0; i<N; i++ ) {
        scanf("%d", &X);
        Tmp = Find(BST, X);
        if (Tmp == NULL) printf("%d is not found\n", X);
        else {
            printf("%d is found\n", Tmp->Data);
            if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);
            if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);
        }
    }
    scanf("%d", &N);
    for( i=0; i<N; i++ ) {
        scanf("%d", &X);
        BST = Delete(BST, X);
    }
    printf("Inorder:"); InorderTraversal(BST); printf("\n");
    return 0;
}
/* 你的代码将被嵌在这里 */

10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3

Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9

二进制搜索树就是这样一种数据结构: 如果树的值大于根二叉排序树c语言,则放在右子上;如果树的值小于根,则放在左子上<

c语言二叉树遍历算法_二叉树的遍历c语言_二叉排序树c语言

查找功能易于编写

递归形式(尾递归):

Position Find(BinTree BST, ElementType X)
{
	if (!BST)
		return  NULL;
	if (X > BST->Data)
		return Find(BST->Right, X);
	else if (X < BST->Data)
		return Find(BST->Right, X);
	else
		return BST;
}

非递归形式:

Position Find(BinTree BST, ElementType X)
{
	while (BST)
	{
		if (X > BST->Data)
			BST = BST->Right;
		else if (X < BST->Data)
			BST = BST->Left;
		else
			return BST;
	}
	return NULL;
}

c语言二叉树遍历算法_二叉树的遍历c语言_二叉排序树c语言

最大值必须在最右边的叶子节点上,最小值必须在最右边的叶子节点上,因此您可以编写函数来查找最大值和最小值

Position FindMin(BinTree BST)
{
	while (BST)
	{
		if (!BST->Left)
		{
			return BST;
		}
		else
		{
			BST = BST->Left;
		}
	}
	return NULL;
}
Position FindMax(BinTree BST)
{
	while (BST)
	{
		if (!BST->Right)
		{
			return BST;
		}
		else
		{
			BST = BST->Right;
		}
	}
	return NULL;
}

使用递归的想法总是将二叉搜索树的插入插入叶子节点之后

BinTree Insert(BinTree BST, ElementType X)
{
	if (!BST)
	{
		BinTree BST = (BinTree)malloc(sizeof(struct TNode));
		BST->Data = X;
		BST->Left = NULL;
		BST->Right = NULL;
	}
	else
	{
		if (X < BST->Data)
		{
			BST->Left = Insert(BST->Left, X);  // 递归插入左子数
		}
		else if (X > BST->Data)
		{
			BST->Right = Insert(BST->Right, X); // 递归插入右子数
		}
	}
	return BST;
}

删除二进制搜索树有三种情况

二叉排序树c语言_c语言二叉树遍历算法_二叉树的遍历c语言

1. 叶子节点被删除,没有左子节点或右子节点,直接删除,并将根节点设置为空

2. 有一个儿子被删除. 只是将父亲指向这一点.

3. 左右儿子被删除. 用左子编号的最大值或右子编号的最小值替换节点,因为二叉搜索树的左子值应小于该根(右子编号的值)大于此根二叉排序树c语言,因此替换后无效,然后删除该节点.

BinTree Delete(BinTree BST, ElementType X)
{
	Position Tmp;
	if (!BST)
	{
		printf("Not Found\n");
	}
	else if (X < BST->Data)
	{
		BST->Left = Delete(BST->Left, X);   // 递归删除左子树
	}
	else if (X > BST->Data)
	{
		BST->Right = Delete(BST->Right, X); // 递归删除右子树
	}
	// 找到要删除的节点
	else
	{
		// 如果被删除节点有子数,寻找下一个节点填充删除节点
		if (BST->Left && BST->Right)
		{
			Tmp = FindMin(BST->Right);  // 在被删除节点的右子数中找最小的元素填充删除节点
			BST->Data = Tmp->Data;
			BST->Right = Delete(BST->Right, BST->Data);  // 递归删除右子树最大值
		}
		else
		{
			// 如果被删除结点有一个或者没有儿子
			Tmp = BST;
			if (!BST->Left)
			{
				BST = BST->Right;   // 如果这个子数没有左儿子,将右儿子的指针赋给它,Free它
			}
			else if (!BST->Right)
			{
				BST = BST->Left;   // 如果这个子数没有右儿子,将左儿子的指针赋给它,Free它
			}
			free(Tmp);             // 这两种写法已经包括了有一个子数
		}
	}
	return BST;
}

完整代码


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-252599-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 晋侯姬燮
        晋侯姬燮

        医生不行贿会好好给你看病吗

      热点图片
      拼命载入中...