二叉搜索樹(二叉排序樹)

開始個人樹的學習: 二叉搜索樹->平衡樹AVL->紅黑樹

參考的博客地址://http://blog.chinaunix.net/uid-27033491-id-3301179.html

個人代碼如下:

//http://blog.chinaunix.net/uid-27033491-id-3301179.html
#include <iostream>
using namespace std;

//二叉搜索樹和二叉排序樹
class BTree
{
public:
	typedef struct Node
	{
		Node(){}
		Node(int d, Node* l, Node* r):data(d),left(l),right(r){}
		int data;
		struct Node* left;
		struct Node* right;
	}Node;
public:
	BTree():Root(NULL) {}
	Node* Search(int elem);
	Node** ppSearch(int elem);
	void Insert(int elem);
	void Delete(int elem);
	void Print(Node *Root);
	~BTree();
//private:
	Node* Root;
	void FreeDynaMemory(Node* root);
};

void BTree:: Print(Node* Root)
{
	if(NULL == Root) return;
	cout<< Root->data << " ";
	Print(Root->left);
	Print(Root->right);
}

BTree::Node* BTree::Search(int elem)
{
	Node* Loop = Root;
	while(Loop)
	{
		if(elem == Loop->data) return Loop;
		else if(elem > Loop->data)
		{
			Loop = Loop->right;
			continue;
		}
		else
		{
			Loop = Loop->left;
			continue;
		}
	}
	return NULL;
}

void BTree::Insert(int elem)
{
	Node** root = &Root;
	while(*root)
	{ 
		if((*root)->data == elem)
			return ;
		else if((*root)->data < elem) 
			{
				root = &((*root)->right);
				continue;
			} 
		else
			{
				root = &((*root)->left);
				continue;
			}
	}
	*root = new Node(elem, NULL, NULL);
}

BTree::Node** BTree::ppSearch(int elem)
{
	Node** nodeLoop = &Root;
	while(*nodeLoop)
	{
		if((*nodeLoop)->data == elem)
			return nodeLoop;
		else if((*nodeLoop)->data < elem)
			nodeLoop = &((*nodeLoop)->right);
		else
			nodeLoop = &((*nodeLoop)->left);
	}
	return NULL;
}

void BTree::Delete(int elem)
{
	Node**ppNode = ppSearch(elem);
	if(NULL == ppNode) return;
	//它是葉子節點
	if(NULL == (*ppNode)->left && NULL == (*ppNode)->right)
	{
		delete (*ppNode);
		*ppNode = NULL;
	}
	else if(NULL != (*ppNode)->left && NULL == (*ppNode)->right)
	{
		//它只有左子樹
		Node *pTmp = *ppNode;
		*ppNode = (*ppNode)->left;
		delete pTmp;
	}
	else if(NULL == (*ppNode)->left && NULL != (*ppNode)->right)
	{
		//它只有右子樹
		Node *pTmp = *ppNode;
		*ppNode = (*ppNode)->right;
		delete pTmp;
	}
	else
	{
		//它有左右子樹
		Node *pRight = (*ppNode)->right;
		Node *pTmp = *ppNode;
		*ppNode = (*ppNode)->left;
		delete pTmp;

		Node** ppLoop = ppNode;
		while(*ppLoop)
			ppLoop = &((*ppLoop)->right);
		*ppLoop = pRight;
	}
}

void BTree::FreeDynaMemory(Node* root)
{
	if(NULL == root) return;
	FreeDynaMemory(root->left);
	FreeDynaMemory(root->right);
	delete root;
}
BTree::~BTree()
{
	if(NULL == Root) return;
	FreeDynaMemory(Root);
}

int main()
{
	int a[] = {345, 123, 456, 12, 3, 14};
	int len = sizeof(a)/sizeof(int);
	BTree bt;
	for(int i = 0; i < len; ++i)
		bt.Insert(a[i]); 

	bt.Delete(345);
	BTree::Node* tmp = bt.Search(12);
	if(NULL != tmp)
		cout<< tmp->data <<endl;
	bt.Print(bt.Root);
	return 0;
}

輸出:


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