實現基本二叉樹操作

//mytree.h
#pragma once
typedef int ElemType;
#ifndef _MYTREE_H_
#define _MYTREE_H_
struct TreeNode;
typedef struct TreeNode *SearchTree;
typedef struct TreeNode *Position;

void MakeEmpty(SearchTree tree);
SearchTree Insert(SearchTree tree, ElemType x);
SearchTree Delete(SearchTree tree, ElemType x);
Position find(SearchTree tree, ElemType x);
Position findMin(SearchTree tree);
Position findMax(SearchTree tree);
void printTree(SearchTree tree,ElemType n);
ElemType Retrieve(Position tree);

#endif

struct TreeNode
{
	ElemType element;
	SearchTree left;
	SearchTree right;
};


//mytree.cpp
#include <stdlib.h>
#include <stdio.h>
#include "mytree.h"

void MakeEmpty(SearchTree tree)
{
	while (tree != NULL)
	{
		MakeEmpty(tree->left);
		MakeEmpty(tree->right);
		free(tree);
	}
}

SearchTree Insert(SearchTree tree, ElemType x)
{
	if (tree == NULL)
	{
		tree = (SearchTree)malloc(sizeof(struct TreeNode));
		if (tree == NULL)
			return NULL;
		else
		{
			tree->element = x;
			tree->left = NULL;
			tree->right = NULL;
			return tree;
		}

	}
	else if (x < tree->element)
		tree->left=Insert(tree->left, x);
	else if (x > tree->element)
		tree->right=Insert(tree->right, x);
	return tree;
}
SearchTree Delete(SearchTree tree, ElemType x)
{
	SearchTree tempTree = NULL;
	if (tree == NULL)
		return NULL;
	else
	{
		if (x < tree->element)
			tree->left = Delete(tree->left, x);
		else if (x>tree->element)
			tree->right = Delete(tree->right, x);
		else
		{
			if (tree->left&&tree->right)
			{
				tempTree = findMin(tree->right);
				tree->element = tempTree->element;
				tree->right = Delete(tree->right, tempTree->element);
			}
			else
			{
				if (tree->left == NULL)
				{
					tempTree = tree;
					tree = tree->right;

				}
				else if (tree->right == NULL)
				{
					tempTree = tree;
					tree = tree->left;
				}
				else
					tree = NULL;
				free(tempTree);
			}
		}
	}
	return tree;
		
		
		

}

Position find(SearchTree tree, ElemType x)
{
	if (tree == NULL)
	{
		return NULL;
	}
	else if (x < tree->element)
	{
		return find(tree->left, x);
	}
	else if (x>tree->element)
		return find(tree->right, x);
	else
		return tree;
}
Position findMin(SearchTree tree)
{
	if (tree == NULL)
		return NULL;
	else
	{
		if (tree->left != NULL)
			return findMin(tree->left);
		else
			return tree;
	}
}
Position findMax(SearchTree tree)
{
	if (tree == NULL)
		return NULL;
	else
	{
		if (tree->right != NULL)
			return findMax(tree->right);
		else
			return tree;
	}
}
void printTree(SearchTree tree,ElemType n)
{
	int m = n;
	if (tree == NULL)
		
		return;
	else
	{
		while (--m)
		{
			printf(" ");
		}
		printf("%d\n",tree->element);
		printTree(tree->left, n + 1);
		printTree(tree->right, n + 1);
	}
}

ElemType Retrieve(Position tree)
{
	if (tree != NULL)
		return tree->element;
	else
		return -1;
}

//main.cpp
#include <stdlib.h>
#include <stdio.h>
#include "mytree.h"

int main(int *argc, int *args[])
{
	SearchTree tree = NULL;
	int number = 15;
	MakeEmpty(tree);
	tree = Insert(tree, 10);
	tree = Insert(tree, 12);
	tree = Insert(tree, 8);
	tree = Insert(tree, 15);
	tree = Insert(tree, 9);
	tree = Insert(tree, 6);
	printTree(tree, 1);
	printf("\n\n");

	printf("findMin=%d\n", Retrieve(findMin(tree)));

	printf("findMax=%d\n", Retrieve(findMax(tree)));

	printf("find%d = %d\n", number, Retrieve(find(tree, number)));

	tree = Delete(tree, 15);
	tree = Delete(tree, 8);
	tree = Delete(tree, 6);
	tree = Delete(tree, 11);
	tree = Delete(tree, 10);
	tree = Delete(tree, 12);
	tree = Delete(tree, 9);
	printTree(tree, 1);
	printf("\n\n");

	system("PAUSE");
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章