c++類實現二叉查找樹的抽象數據結構

說明:
1.0  二叉查找樹可以看成是改進的二分查找法:  不需要依賴有序的數組
1.1 對於二叉查找樹的前綴/後綴的查找,可能需要改變二叉樹的類型,增加parent指針
1.2 對於插入/刪除/查找(二分,最值之類)的操作,不需要考慮parent指針的問題
1.3  二叉查找樹的平衡度可能很差,可能的解決辦法:1.隨機讀取數組中的數據; 2.重新構建一顆AVL樹
<pre name="code" class="cpp">#ifndef BINARYTREE_H
#define BINARYTREE_H
#include<iostream>
using namespace std;

typedef struct linknode {
	int data;
	struct linknode *left;
	struct linknode *right;
	struct linknode *parent;
}*ptree,tree;

class BINARYTREE{
public:
	BINARYTREE(){};
	~BINARYTREE(){};
	void insertTree(ptree _tree, ptree treeNode) const ;  //插入
	ptree createTree(int arr[],int size) ;
	void middleOrder(ptree _tree) const ;      
	void preOrder(ptree _tree) const;
	int BSTsearch(ptree _tree, int value);                //查找
	int BSTsearch2(ptree _tree, int value) ;
	ptree MAX(ptree _tree);                               //查找最大值
	ptree MIN(ptree _tree);
	int DELETE(ptree &valueNode);                         //刪除節點
	int deleteNode(ptree &_tree, int value);
	
};

void BINARYTREE::insertTree(ptree _tree, ptree treeNode) const {
	if(_tree->data>=treeNode->data ) {
		if(NULL == _tree->left) {
			_tree->left=treeNode;
			treeNode->parent=_tree;
		}
		else {
			insertTree(_tree->left,treeNode);
		}
	}
	if(_tree->data<treeNode->data  ) {
		if(NULL==_tree->right) {
			_tree->right = treeNode;
			treeNode->parent = _tree;
		}
		else {
			insertTree(_tree->right,treeNode);
		}
	}
	
}

ptree BINARYTREE::createTree(int arr[], int size) {
	int i;
	ptree _tree = new tree;
	_tree->data=arr[0];
	_tree->left=NULL;
	_tree->right=NULL;
	_tree->parent=NULL;
	for( i=1; i<size; ++i ) {
		ptree treeTmp = new tree;
		treeTmp->data=arr[i];
		treeTmp->left=NULL;
		treeTmp->right=NULL;
		treeTmp->parent=NULL;
		insertTree(_tree,treeTmp);
	}
	return _tree;
}

void BINARYTREE::middleOrder(ptree _tree) const {
	if(NULL==_tree) {
		return;
	}
	middleOrder(_tree->left);
	cout<<_tree->data<<"  ";
	middleOrder(_tree->right);
}
void BINARYTREE::preOrder(ptree _tree) const {
	if(NULL==_tree) {
		return;
	}
	cout<<_tree->data<<"  ";
	preOrder(_tree->left);	
	preOrder(_tree->right);
}

int BINARYTREE::BSTsearch(ptree _tree, int value) {
	if(NULL==_tree) {
		return -1;
	}
	if(value>_tree->data) {
		return BSTsearch(_tree->right,value);
	}
	if(value<_tree->data) {
		return BSTsearch(_tree->left,value);
	}
	if(value==_tree->data) {
		return 1;
	}
	return -1;
}

int BINARYTREE::BSTsearch2(ptree _tree, int value) {
	if(NULL == _tree) {
		return -1;
	}
	while( NULL != _tree && value!=_tree->data) {
		_tree=(value<_tree->data?_tree->left:_tree->right);
	}
	if( NULL != _tree ) {
		return 1;
	}
	return -1;


}
ptree BINARYTREE::MAX(ptree _tree) {
	if(NULL == _tree ) {
		return NULL;
	}
	while( NULL != _tree->right ) {
		_tree=_tree->right;
	} 
	return _tree;
}

int BINARYTREE::DELETE(ptree &valueNode){
	//顯然此時不存在節點是空的情況
	//1.是葉子節點,直接刪除
	//2.只有左/右子樹,刪除蛻化成單鏈表的刪除(特殊在於,知道該節點的地址,所以只用保留後繼即可刪除)
	//3.有左+右節點。問題轉化成:
	//3.1尋找該節點的前繼(該節點的左子樹的最大值(左子樹的最右邊值),同時記錄最大值的上一個狀態);
	//3.2前繼覆蓋此節點(模擬刪除);
	//3.3刪除前繼節點:2種情況,見代碼
	if(NULL==valueNode->left) {
		ptree tmp = valueNode;
		valueNode=valueNode->right;
		delete tmp;
		tmp=NULL;
	}
	else if(NULL == valueNode->right) {
		ptree tmp= valueNode->left;
		delete valueNode;
		valueNode=tmp;
	}
	else if(NULL!=valueNode->left && NULL!=valueNode->left) {
		ptree parentNode=valueNode;
		ptree tmp = valueNode->left;
		while(tmp->right) {
			parentNode = tmp;
			tmp=tmp->right;
		}
		valueNode->data=tmp->data;
		if(parentNode!=valueNode) {
			parentNode->right=tmp->left;
		}
		else {
			valueNode->left=NULL;
		}
		delete tmp;
		tmp=NULL;
	}
	return 1;
}

int BINARYTREE::deleteNode(ptree &_tree, int value) {
	if(NULL==_tree) {
		return -1;
	}
	if(value == _tree->data) {
		return DELETE(_tree);
	}
	if(value<_tree->data) {
		return deleteNode(_tree->left,value);
	}
	if(value>_tree->data) {
		return deleteNode(_tree->right,value);
	}
	return 1;
}

#endif

#include"search.h"
#include"binaryTree.h"

int main() {
	int arr[]={1,2,3,4,5,6};
	int arr1[]={1,4,5,2,3,6};
	int size=sizeof(arr)/sizeof(int);
	int value=4;
	BINARYTREE * _binarytree = new BINARYTREE;
	
	ptree _tree = _binarytree->createTree(arr1,size);
	ptree maxNode = _binarytree->MAX(_tree);
	cout<<"max number in tree is : " <<maxNode->data<<endl;
	_binarytree->middleOrder(_tree);
	cout<<""<<endl;
	_binarytree->preOrder(_tree);
	cout<<""<<endl;
	_binarytree->deleteNode(_tree,4);
	_binarytree->middleOrder(_tree);
	cout<<""<<endl;
	//_binarytree->preOrder(_tree);

	SEARCH * _search = new SEARCH;
	if(1 == _search->binarySearch1(arr,size,value)) {
		cout<<value<<" in arrary!"<<endl;
	}
	if(1 == _search->binarySearch2(arr,0,size-1,value)) {
		cout<<value<<" in arrary!"<<endl;
	}

	if(1 == _binarytree->BSTsearch(_tree,value)) {
		cout<<value<<" in arrary!"<<endl;
	}
	else {
		cout<<value<<" not in arrary!"<<endl;
	}
    
	cout<<_binarytree->BSTsearch2(_tree,value)<<endl;
	
	system("pause");
	return 1;
<p>}</p><p>
</p><p>
</p><p>參考:http://songlee24.github.io/2015/01/13/binary-search-tree/參考:http://songlee24.github.io/2015/01/13/binary-search-tree/</p>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章