[PTA] 数据结构与算法题目集 6-12 二叉搜索树的操作集
唯一比较需要思考的删除操作:
被删除节点有三种情况:
1、叶节点,直接删除
2、只有一个子节点,将子节点替换为该节点,删除该节点。
3、有两个子节点,从右分支中找到最小节点,将其值赋给被删除节点的位置,接着删除这个最小节点
// 函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;
BinTree Insert(BinTree BST, ElementType X) { if (BST == NULL) { BST = (BinTree)malloc(sizeof(BinTree)); BST->Data = X; BST->Left = NULL; BST->Right = NULL; } if (X > BST->Data) BST->Right = Insert(BST->Right, X); if (X < BST->Data) BST->Left = Insert(BST->Left, X); return BST; } // 函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针; BinTree Delete(BinTree BST, ElementType X) { if (BST == NULL) { 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 if (X == BST->Data) { 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,返回该结点的指针;如果找不到则返回空指针; Position Find(BinTree BST, ElementType X) { while (BST) { if (X == BST->Data) return BST; else if (X < BST->Data) BST = BST->Left; else if (X > BST->Data) BST = BST->Right; } return NULL; } //函数FindMin返回二叉搜索树BST中最小元结点的指针; Position FindMin(BinTree BST) { if (BST == NULL) return NULL; while (BST->Left) BST = BST->Left; return BST; } //函数FindMax返回二叉搜索树BST中最大元结点的指针。 Position FindMax(BinTree BST) { if (BST == NULL) return NULL; while (BST->Right) BST = BST->Right; return BST; }