插入代码:
void InsertOfBSTree(BiSTree * pHeadNode,int ToBeInsertedNum)
{
BiSTree * pNode=pHeadNode;
BiSTree * pFatherNode=NULL;
BiSTree * pNewNode=new BiSTree();
while(pNode!=NULL)
{
pFaherNode=pNode;
if(pNode->m_Value>ToBeInsertedNum)
pNode=pNode->m_pLeft;
else
pNode=pNode->m_pRight;
}
if(!pHeadNode)
{
pNewNode->m_Value=ToBeInsertedNum;
pHeadNode=pNewNode;
}
else
{
if(pFatherNode->m_Value>ToBeInsertedNum)
{
pNewNode->m_Value=ToBeInsertedNum;
pFatherNode->m_pLeft=pNewNode;
}
else
{
pNewNode->m_Value=ToBeInsertedNum;
pFatherNode->m_pRight=pNewNode;
}
}
}
删除代码:
template<typename node>void DeleteOfBSTree(node *pHeadNode,node *ToBeDeletedNode)
{
if(!pHeadNode||!ToBeDeletedNode)//adjust node is NULL or not
return;
if(!ToBeDeletedNode->m_pLeft&&!ToBeDeletedNode->m_pRight)//right and left child is null
{
delete ToBeDeletedNode;
ToBeDeletedNode=NULL;
}
else if(ToBeDeleteNode->m_pLeft!=NULL)//left child is not null,get largest node to replace tobedeletednode
{
node *pNode=ToBeDeletedNode->m_pLeft;
while(pNode->m_pRight)
{
pNode=pNode->m_pRight;
}
if(pNode==ToBeDeletedNode->m_pLeft)
{
ToBeDeletedNode->m_Value=pNode->m_Value;
ToBeDeletedNode->m_pLeft=pNode->m_pLeft;
}
else
ToBeDeletedNode->m_Value=pNode->m_Value;
delete pNode;
pNode=NULL;
}
else if(!ToBeDeletedNode->m_pLeft&&ToBeDeletedNode->m_pRight!=NULL)//left child is NULL,right is not.get smallest node to replace tobedeletednode
{
node *pNode=ToBeDeletedNode->m_pRight;
while(pNode->m_pLeft)
{
pNode=pNode->m_pLeft;
}
if(pNode==ToBeDeletedNode->m_pRight)
{
ToBeDeletedNode->m_Value=pNode->m_Value;
ToBeDeletedNode->m_pRight=pNode->m_pRight;
}
else
ToBeDeletedNode->m_Value=pNode->m_Value;
delete pNode;
pNode=NULL;
}
}
删除的思想就是:1、判断被删除节点的左右子树是否存在,都不存在,直接删除该节点。2、如果左子树存在,不管右子树存不存在,都把左子树里的最大值赋值给被删除节点的值域,同时删除该节点,这里要注意,如果这个节点就是被删除节点的左节点,直接进行赋值操作(把左节点的左子树赋值为被删除节点的左子树)3、左子树不存在,右子树存在,思想和2一样,不过是找右子树的最小值。