1. 程式人生 > >[PTA] 資料結構與演算法題目集 6-12 二叉搜尋樹的操作集

[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; }