c语言 树 管理系统,C语言实现二进制搜索树

7a8c55de3fea2eb4f4495eec11a57e34.png

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;

};

81df149f4f3c39261c497c6b31f43f8d.png

#include

#include

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

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

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

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语言,则放在右子上;如果树的值小于根,则放在左子上<

e83507b99fa25a465bc6bd580e7cdb58.png

30816a350cea5ca3e4efa9fcd18a8de4.png

查找功能易于编写

递归形式(尾递归):

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;

}

281800eeb354afab3472e5659c3fb41b.png

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

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;

}

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

03330ec49a5eaab0f324fa33d918e755.png

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;

}

完整代码

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-252599-1.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值