#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 = BST->Right = NULL; } if (BST->Data < x) BST->Right = Insert(BST->Right, x); if (BST->Data > x) BST->Left = Insert(BST->Left, x); return BST; }
BinTree Delete(BinTree BST, ElementType x) { 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 (x == BST->Data) { if (BST->Left && BST->Right) { BinTree t = FindMin(BST->Right); BST->Data = t->Data; BST->Right = Delete(BST->Right, BST->Data); } else {
if (!BST->Left)BST = BST->Right; else if (!BST->Right)BST = BST->Left; } } } return BST; }
Position Find(BinTree BST, ElementType X) { if (BST == NULL) return NULL; if (BST->Data == X) return BST; else if (X < BST->Data) return Find(BST ->Left,X); else if (X > BST->Data) return Find(BST ->Right, X); return BST; } Position FindMin(BinTree BST) { if (BST) { if (BST->Left) return FindMin(BST->Left); else return BST; } } Position FindMax(BinTree BST) { if (BST) { if (BST->Right) return FindMax(BST->Right); else return BST; } }
void InorderTraversal(BinTree BT) { if (BT == NULL) return; InorderTraversal(BT->Left); printf(" %d", BT->Data); InorderTraversal(BT->Right);
} void PreorderTraversal(BinTree BT) { if (BT == NULL) return; printf(" %d", BT->Data); PreorderTraversal(BT->Left); PreorderTraversal(BT->Right); }
|