week10 BST
This commit is contained in:
103
week10/BST.c
Normal file
103
week10/BST.c
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Author: Walter
|
||||
* Student ID: 1930006025
|
||||
* week_10_BST
|
||||
*/
|
||||
|
||||
#include "BST.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
Node *insertNode(Node **proot, int x) {
|
||||
/* create if empty */
|
||||
if ((*proot) == NULL) {
|
||||
*proot = (Node *)malloc(sizeof(Node));
|
||||
if (*proot == NULL) {
|
||||
fprintf(stderr, "Can not allocate new space for node\n");
|
||||
exit(1);
|
||||
}
|
||||
(*proot)->key = x;
|
||||
(*proot)->left = (*proot)->right = NULL;
|
||||
return *proot;
|
||||
}
|
||||
|
||||
if (x < (*proot)->key) {
|
||||
return insertNode(&((*proot)->left), x);
|
||||
} else if (x > (*proot)->key) {
|
||||
return insertNode(&((*proot)->right), x);
|
||||
}
|
||||
|
||||
/* equal, do nothing and return NULL,
|
||||
* because insertion is not successful */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Node *findNode(Node *root, int x) {
|
||||
/* empty tree */
|
||||
if (root == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (x < root->key) {
|
||||
return findNode(root->left, x);
|
||||
} else if (x > root->key) {
|
||||
return findNode(root->right, x);
|
||||
}
|
||||
|
||||
/* equal */
|
||||
return root;
|
||||
}
|
||||
|
||||
Node *deleteNode(Node **proot, int x) {
|
||||
Node *tmpNode;
|
||||
|
||||
/* not found */
|
||||
if (*proot == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* find the node needs to be delete */
|
||||
if (x < (*proot)->key) {
|
||||
return deleteNode(&((*proot)->left), x);
|
||||
} else if (x > (*proot)->key) {
|
||||
return deleteNode(&((*proot)->right), x);
|
||||
}
|
||||
|
||||
if ((*proot)->left && (*proot)->right) {
|
||||
/* two child, find the min on right to replace */
|
||||
tmpNode = (*proot)->right;
|
||||
while (tmpNode->left) {
|
||||
tmpNode = tmpNode->left;
|
||||
}
|
||||
/* simply replace key value */
|
||||
(*proot)->key = tmpNode->key;
|
||||
/* delete tmpNode, which has one or zero child */
|
||||
return deleteNode(&(*proot)->right, tmpNode->key);
|
||||
} else if ((*proot)->left || (*proot)->right) {
|
||||
/* one child */
|
||||
tmpNode = *proot;
|
||||
if ((*proot)->left) {
|
||||
*proot = (*proot)->left;
|
||||
}
|
||||
if ((*proot)->right) {
|
||||
*proot = (*proot)->right;
|
||||
}
|
||||
} else {
|
||||
/* no child */
|
||||
tmpNode = *proot;
|
||||
*proot = NULL;
|
||||
}
|
||||
|
||||
return tmpNode;
|
||||
}
|
||||
|
||||
void destroyTree(Node *root) {
|
||||
/* end situation */
|
||||
if (root == NULL) {
|
||||
return;
|
||||
}
|
||||
destroyTree(root->left);
|
||||
destroyTree(root->right);
|
||||
free(root);
|
||||
return;
|
||||
}
|
||||
Reference in New Issue
Block a user