二叉树 C++实现

二叉树 C++实现

支持插入、删除、查找操作

实现二叉树的前、中、后序遍历(包括递归和非递归)

#include <climits>
#include <iostream>
#include <stack>


#ifndef BINARY_SEARCH_TREE
#define BINARY_SEARCH_TREE

const int INF = INT_MAX;
using namespace std;

struct Node
{
	int value;
	Node *left_child;
	Node *right_child;
};

Node *get_node();

class BinarySearchTree{
private:
	Node *root;

	void remove_current_node(Node *current, Node* parent);
	void traversal_inorder_helper(Node *tree);
	void traversal_preorder_helper(Node *tree);
	void traversal_postorder_helper(Node *tree);

public:
	BinarySearchTree();
	bool insert(int);
	bool remove(int);
	bool search(int);
	void traversal_inorder_recursive();
	void traversal_inorder_iterative();
	void traversal_preorder_recursive();
	void traversal_preorder_iterative();
	void traversal_postorder_recursive();
	void traversal_postorder_iterative();
};

#endif

Node *get_node()
{
	Node *newNode = new Node();
	newNode->left_child = newNode->right_child = NULL;

	return newNode;
}

BinarySearchTree::BinarySearchTree()
{
	root = get_node();
	root->value = INF;
}

bool BinarySearchTree::insert(int value){
	if(root->value == INF)
	{
		root->value = value;
		return true;
	}

	Node *current = root;
	Node *newNode = get_node();

	if(newNode == NULL)
		return false;

	while(true)
	{
		if(value <= current->value)
		{
			if(current->left_child == NULL)
			{
				current->left_child = newNode;
				current->left_child->value = value;
				return true;
			}
			else
			{
				current = current->left_child;
			}
		}
		else
		{
			if(current->right_child == NULL)
			{
				current->right_child = newNode;
				current->right_child->value = value;
				return true;
			}
			else
			{
				current = current->right_child;
			}
		}
	}

}


bool BinarySearchTree::remove(int value)
{
	if(root->value == INF){
		return false;
	}

	Node *current = root;
	Node *parent = NULL;

	while(true)
	{
		if(value == current->value)
		{
			remove_current_node(current, parent);
		}
		else
		{
			parent = current;

			if(current->value < value)
			{
				current = current->right_child;
			}
			else
			{
				current = current->left_child;
			}

			if(current == NULL)
			{
				return false;
			}
		}
	}
}



void BinarySearchTree::remove_current_node(Node *current, Node *parent)
{
	Node *toBeDeleted;
	Node *successor;
	Node *successorParent = NULL;

	if(current->right_child == NULL and current->left_child == NULL)
	{
		if(parent == NULL){
			current->value = INF;
		}
		else
		{
			if(parent->left_child == current)
				parent->left_child = NULL;
			else
				parent->right_child = NULL;

			delete current;
		}
	}
	else if(current->right_child == NULL)
	{
		toBeDeleted = current->left_child;
		current->value = current->left_child->value;
		current->right_child = current->left_child->right_child;
		current->left_child = current->left_child->left_child;

		delete toBeDeleted;
	}
	else
	{
		successor = current->right_child;
		successorParent = NULL;

		while(successor->left_child != NULL)
		{
			successorParent = successor;
			successor = successor->left_child;
		}

		if(successorParent == NULL)
		{
			current->right_child = successor->right_child;
		}
		else
		{
			successorParent->left_child = successor->right_child;
		}

		current->value = successor->value;
		delete successor;
	}
}


bool BinarySearchTree::search(int value)
{
	Node *current = root;

	while(true)
	{
		if(value < current->value)
		{
			if(current->left_child == NULL)
			{
				return false;
			}
			else
			{
				current = current->left_child;
			}
		}
		else if(value > current->value)
		{
			if(current->right_child == NULL)
			{
				return false;
			}
			else
			{
				current = current->right_child;
			}
		}
		else
		{
			return true;
		}
	}
}


void BinarySearchTree::traversal_inorder_helper(Node *tree)
{
	if(tree == NULL or tree->value == INF)
		return ;

	traversal_inorder_helper(tree->left_child);
	cout << tree->value <<endl;
	traversal_inorder_helper(tree->right_child);
}

void BinarySearchTree::traversal_inorder_recursive()
{
	traversal_inorder_helper(root);
}

void BinarySearchTree::traversal_inorder_iterative()
{
	if(root->value == INF)
		return;

	stack<Node *> traversal;
	Node *current = root;
	bool complete = false;

	while(!complete)
	{
		if(current != NULL)
		{
			traversal.push(current);
			current = current->left_child;
		}
		else if(!traversal.empty())
		{
			current = traversal.top();
			traversal.pop();
			cout << current->value << endl;
			current = current->right_child;
		}
		else
		{
			complete = true;
		}

	}
}


void BinarySearchTree::traversal_preorder_helper(Node *tree)
{
	if(tree == NULL or tree->value == INF)
	{
		return ;
	}

	cout << tree->value << endl;
	traversal_preorder_helper(tree->left_child);
	traversal_preorder_helper(tree->right_child);
}

void BinarySearchTree::traversal_preorder_recursive()
{
	traversal_preorder_helper(root);
}

void BinarySearchTree::traversal_preorder_iterative()
{
	if(root->value == INF)
	{
		return ;
	}

	stack<Node *> traversal;
	Node *current;

	traversal.push(root);

	while(!traversal.empty()){
		current = traversal.top();
		traversal.pop();
		cout << current->value << endl;

		if(current->right_child != NULL)
		{
			traversal.push(current->right_child);
		}

		if(current->left_child != NULL)
		{
			traversal.push(current->left_child);
		}
	}
}

void BinarySearchTree::traversal_postorder_helper(Node *tree)
{
	if(tree == NULL or tree->value == INF)
	{
		return;
	}
	else
	{
		traversal_postorder_helper(tree->left_child);
		traversal_postorder_helper(tree->right_child);
		cout << tree->value << endl;
	}
}


void BinarySearchTree::traversal_postorder_recursive()
{
	traversal_postorder_helper(root);
}


void BinarySearchTree::traversal_postorder_iterative()
{
	if(root->value == INF)
	{
		return ;
	}

	stack<Node *> traversal;
	Node *current = root;

	do
	{
		while(current)
		{
			if(current->right_child)
				traversal.push(current->right_child);
			traversal.push(current);

			current = current->left_child;
		}

		current = traversal.top();
		traversal.pop();

		if(current->right_child and traversal.empty() == false and traversal.top() == current->right_child)
		{
			traversal.pop();
			traversal.push(current);
			current = current->right_child;
		}
		else
		{
			cout << current->value << endl;
			current = NULL;
		}
	}while( !traversal.empty());

}

int main()
{
	BinarySearchTree tree;

	tree.insert(10);
	tree.insert(14);
	tree.insert(12);
	tree.insert(5);

	cout << "In Order Traversal: \n";
    tree.traversal_inorder_recursive();

    cout << "Pre Order Traversal: \n";
    tree.traversal_preorder_recursive();

    cout << "Post Order Traversal: \n";
    tree.traversal_postorder_recursive();

    cout << "Searching 10 : ";
    if(tree.search(10))
        cout << "Found!\n";
    else
        cout << "Not found!\n";

    cout << "Removing 10\n";
    tree.remove(10);

    cout << "In Order Traversal: \n";
    tree.traversal_inorder_iterative();

    cout << "Pre Order Traversal: \n";
    tree.traversal_preorder_iterative();

    cout << "Post Order Traversal: \n";
    tree.traversal_postorder_iterative();

    cout << "Searching 10 : ";
    if(tree.search(10))
        cout << "Found!\n";
    else
        cout << "Not found!\n";

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值