// delete the node with given value e from the binary search tree
BinarySearchTree deleteBinarySearchTree(ElementType e, BinarySearchTree root)
{
	BinarySearchTree temp;

	if(!root)
		Error(" elements not found, from func deleteBinarySearchTree ");
	
	if(e > root->value) 
		root->right = deleteBinarySearchTree(e, root->right);
	else if(e < root->value) 
		root->left = deleteBinarySearchTree(e, root->left);
	else {// the value of root equals given e
		if(root->left && root->right) { // if the deleting node has both left and right
			root->value = findMin(root->right)->value; // set root's value the minimum of right tree of root
			root->right = deleteBinarySearchTree(root->value, root->right);			
		}		
		else { // one or zero child is not NULL
			// root->left = deleteBinarySearchTree(root->value, root->left);						
			if(root->right) { // if root->right doesn't equal to NULL
				temp = root;
				root = root->right;
				free(temp);												
			}
			else if(root->left){ // if root->left doesn't equal to NULL
				temp = root;
				root = root->left;
				free(temp);				
			}
			else { // if both root->left and root->right equal to NULL
				free(root);
				root = NULL;
			}
		}
		/* you can also fabricate code like this, which is reshipped from data_structure book
			temp = root;
			if(!root->right)
				root = root->left;
			else if(!root->left)
				root = root->right;
			free(temp);
		*/
	}	
	return root;
}
int main()
{
	BinarySearchTree bst;	
	int value[] = {2, 8, 1, 5, 3, 4};
	int i;

	printf("\n ====== test for preordering the BinarySearchTree ====== \n");	 	
	
	printf("\n test for creating a binary search tree with root value 6 \n");	
	bst = createBinarySearchTree(6);
	printPreorder(1, bst); 
		
	printf("\n test for insertint 6 nodes, that's  2, 8, 1, 5, 3 and 4 in turn \n");		
	for(i = 0; i < 6; i++)
		insert(value[i], bst);		
	printPreorder(1, bst); 	 	 

	printf("\n test for find minimum \n");		
	printf(" the minimum is %2d, in this binary search tree! \n", findMin(bst)->value);

	printf("\n test for find maximum \n");		
	printf(" the maximum is %2d, in this binary search tree! \n", findMax(bst)->value);

	printf("\n test for deleting node '2' with two nodes from the binary search tree \n");		
	deleteBinarySearchTree(2, bst);
	printPreorder(1, bst); 	 	 

	printf("\n test for deleting node '5' with one node from the binary search tree \n");		
	deleteBinarySearchTree(5, bst);
	printPreorder(1, bst); 	 	 

	printf("\n test for deleting node '8' with zeron node from the binary search tree \n");		
	deleteBinarySearchTree(8, bst);
	printPreorder(1, bst); 	 	 
	
	printf("\n test for inserting '8', '5' and '2' into the binary search tree \n");		
	insert(8, bst);
	insert(5, bst);
	insert(2, bst);
	printPreorder(1, bst); 	 	 

	return 0;
}
Ejemplo n.º 3
0
int main()
{
    BinarySearchTree *tree = createBinarySearchTree();
    printf("Тестирование двоичного дерева поиска\n");
    while (true)
    {
        printf("Возможные действия:\n");
        printf("0 - выход\n");
        printf("1 - добавить элемент в дерево\n");
        printf("2 - удалить элемент из дерева\n");
        printf("3 - проверить, есть ли элемент в дереве\n");
        printf("4 - вывести элементы в порядке возрастания\n");
        printf("5 - вывести элементы в порядке убывания\n");
        printf("Введите номер действия: ");
        int operationNumber = 0;
        scanf("%d", &operationNumber);
        switch (operationNumber)
        {
            case 0:
            {
                deleteBinarySearchTree(tree);
                return 0;
            }
            case 1:
            {
                printf("Введите элемент для добавления: ");
                int value = 0;
                scanf("%d", &value);
                addToBinarySearchTree(tree, value);
                break;
            }
            case 2:
            {
                printf("Введите элемент для удаления: ");
                int value = 0;
                scanf("%d", &value);
                removeFromBinarySearchTree(tree, value);
                break;
            }
            case 3:
            {
                printf("Введите элемент для проверки: ");
                int value = 0;
                scanf("%d", &value);
                if (existsInBinarySearchTree(tree, value))
                    printf("Элемент найден\n");
                else
                    printf("Элемент не найден\n");
                break;
            }
            case 4:
            {
                printLowToHigh(tree);
                break;
            }
            case 5:
            {
                printHighToLow(tree);
                break;
            }
            default:
            {
                printf("Некорректный номер действия\n");
                break;
            }
        }
    }
}