說明:
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>