1. 程式人生 > >《資料結構》04-樹7 二叉搜尋樹的操作集

《資料結構》04-樹7 二叉搜尋樹的操作集

題目

本題要求實現給定二叉搜尋樹的5種常用操作。

函式介面定義:

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; };
  • 函式Insert將X插入二叉搜尋樹BST並返回結果樹的根結點指標;
  • 函式Delete將X從二叉搜尋樹BST中刪除,並返回結果樹的根結點指標;如果X不在樹中,則列印一行Not Found並返回原樹的根結點指標;
  • 函式Find在二叉搜尋樹BST中找到X,返回該結點的指標;如果找不到則返回空指標;
  • 函式FindMin返回二叉搜尋樹BST中最小元結點的指標;
  • 函式FindMax返回二叉搜尋樹BST中最大元結點的指標。

裁判測試程式樣例:

#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

分析

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

// 插入 
BinTree Insert( BinTree BST, ElementType X ){
	if(!BST){  // 如果為空,建立新結點 
		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(BST->Data < X)
			BST->Right = Insert(BST->Right,X);
	}
	return BST; 
}

// 刪除
BinTree Delete( BinTree BST, ElementType X ){
	BinTree tmp;
	if(!BST){
		printf("Not Found\n");
		return BST;
	}else{
		if(X < BST->Data)
			BST->Left = Delete(BST->Left,X);
		else if(BST->Data < X)
			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,tmp->Data);
			}else{
				tmp = BST;
				if(BST->Left && !BST->Right)
					BST = BST->Left;
				else if(!BST->Left && BST->Right)
					BST = BST->Right;
				else
					BST = NULL;
				free(tmp);
			}
		}
	}
	return BST;
} 

// 尋找值最小結點 
Position FindMin( BinTree BST ){
	if(BST)
		while(BST->Left)
			BST = BST->Left;
	return BST;
}

// 尋找值最大結點
Position FindMax( BinTree BST ){
	if(BST)
		while(BST->Right)
			BST = BST->Right;
	return BST;
} 

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

// 先序遍歷
void PreorderTraversal( BinTree BT ){
	if(BT){
		printf(" %d",BT->Data);
		PreorderTraversal(BT->Left);
		PreorderTraversal(BT->Right);
	}
} 
// 中序遍歷
void InorderTraversal( BinTree BT ){
	if(BT){
		
		InorderTraversal(BT->Left);
		printf(" %d",BT->Data);
		InorderTraversal(BT->Right);
	}
}