题目描述
实现给定二叉搜索树的5种常用操作。
题目地址为:https://pintia.cn/problem-sets/15/problems/927
BinTree结构定义 1 2 3 4 5 6 7
| typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; };
|
插入结点
要求
函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针。
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| BinTree Insert( BinTree BST, ElementType X ) { BinTree node = (BinTree)malloc(sizeof(struct TNode)); node->Data = X; node->Left = NULL; node->Right = NULL;
if (!BST) { return node; }
if (X > BST->Data) { BST->Right = Insert(BST->Right,X); } else if (X < BST->Data) { BST->Left = Insert(BST->Left,X); } else { return BST; } return BST; }
|
删除结点
要求
函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not
Found并返回原树的根结点指针。
找到最小或者最大的结点直接替换掉删除的结点,然后查找到这个用于替换的结点在树中进行删除。因为它必为叶子结点,或单孩子结点。
算法导论上的结论就有些晦涩难懂了。
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| BinTree Delete( BinTree BST, ElementType X ) { if (!BST){ printf("Not Found\n"); return NULL; } if (X > BST->Data) { BST->Right = Delete(BST->Right,X); } else if (X < BST->Data) { BST->Left = Delete(BST->Left,X); } else { Position Node; if (BST->Left && BST->Right) { Node = FindMin(BST->Right); BST->Data = Node->Data; BST->Right = Delete(BST->Right, BST->Data); } else { Node = BST; if (BST->Left == NULL) BST = BST->Right; else if (BST->Right == NULL) BST = BST->Left; free(Node); } } return BST; }
|
查找结点
要求
函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针。
具体代码
1 2 3 4 5 6 7 8 9 10 11 12
| Position Find( BinTree BST, ElementType X ) { while (BST) { if (X == BST->Data) { return BST; } else if (X < BST->Data) { BST=BST->Left; } else { BST=BST->Right; } } return NULL; }
|
查找最小结点
要求
函数FindMin返回二叉搜索树BST中最小元结点的指针。
在树最左边的叶节点就是最小结点。
具体代码
1 2 3 4 5 6 7 8 9
| Position FindMin( BinTree BST ) { if (!BST) { return NULL; } while (BST->Left) { BST=BST->Left; } return BST; }
|
查找最大结点
要求
函数FindMax返回二叉搜索树BST中最大元结点的指针。
在树最右边的叶节点就是最大结点。
具体代码
1 2 3 4 5 6 7 8 9
| Position FindMax( BinTree BST ) { if (!BST) { return NULL; } while (BST->Right) { BST=BST->Right; } return BST; }
|