二叉搜索树(排序二叉树)的概念
若左子树不为空,则左子树所有结点的值都小于根结点的值
若右子树不为空,则右子树所有结点的值都小于根节点的值
左右子树也分别是二叉搜索树
二叉搜索树的最优情况:log 以2为底的N (log2N)
二叉树的最坏情况:N/2;
二叉树的模拟实现
#include <iostream>
#include <vector>
using namespace std;
template<class T>
//二叉搜索树的结构
struct BSTNode
{
T _val;
BSTNode<T>* left;
BSTNode <T>* right;
BSTNode (const T& val=T())
:_val(val)
,left(NULL)
,right(NULL)
{
}
};
template <class T>
class BSTree
{
public:
typedef BSTNode<T> Node;
BSTree ()
:_pnode(NULL)
{
}
//插入
bool insert(const T & val)
{
if(_pnode==NULL)
{
_pnode=new Node(val);
}
Node *cur=_pnode;
Node *parent=_pnode;
while(cur)
{
parent=cur;
if(cur->_val >val)
{
cur=cur->left;
}
else if(cur->_val <val)
{
cur=cur->right;
}
else
return false;
}
cur=new Node(val);
if(val>parent->_val )
{
parent->right =cur;
}
else
parent->left =cur;
}
//如果删除的树没有孩子结点直接删
//如果有一个孩子,则让孩子与父亲结点连接
//如果有两个孩子,则需要找左孩子的最大结点或者右孩子的最小结点,和要删除的进行替换,然后删除那个界定啊
bool erase(const T& val)
{
Node *cur=_pnode;
Node *parent=cur;
while(cur)
{
if(cur->_val >val)
{
parent=cur;
cur=cur->left;
}
else if(cur->_val <val)
{
parent=cur;
cur=cur->right ;
}
else
break;
}
if(cur==NULL)
{
//说明没有这个结点
return false;
}
if(cur->left==NULL)
{
if(cur==parent)
{
_pnode=cur->right;
}
else
{
//说明只有右孩子或者右孩子为空
if(cur==parent->left)
parent->left =cur->right;
else
parent->right=cur->right;
}
delete cur;
}
else if(cur->right==NULL)
{
if(cur==parent)
_pnode=cur->left;
else
{
if(cur==parent->left )
parent->left =cur->left;
else
parent->right=cur->left;
}
delete cur;
}
else
{
Node* leftmax=cur->left ;
Node* parent_=cur;
while(leftmax->right)
{
parent_=leftmax;
leftmax=leftmax->right ;
}
//交换结点
cur->_val =leftmax->_val ;
if(parent->left=leftmax)
parent_->left =leftmax->left ;
else
parent->right=leftmax->left;
delete leftmax;
}
return true;
}
void _InOrder(Node * root)
{
if(root==NULL)
{
return;
}
_InOrder(root->left);
cout<<root->_val<<" ";
_InOrder(root->right);
}
void InOrder()
{
_InOrder(_pnode);
cout<<endl;
}
//删除
private:
Node* _pnode;
}
;
int main()
{
BSTree<int> tree;
tree.insert (2);
tree.insert (5);
//tree.insert (1);
//tree.insert (6);
//tree.insert (8);
//tree.erase (2);
tree.erase (5);
tree.InOrder ();
return 0;
}