索引二叉搜索树.docx
- 文档编号:9121330
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:13
- 大小:16.94KB
索引二叉搜索树.docx
《索引二叉搜索树.docx》由会员分享,可在线阅读,更多相关《索引二叉搜索树.docx(13页珍藏版)》请在冰豆网上搜索。
索引二叉搜索树
//linkedbinarytreeimplementationofabinarysearchtree
//implementsalldictionaryandbsTreemethods
#ifndefindexedBinarySearchTree_
#defineindexedBinarySearchTree_
#include"indexedBSTree.h"
#include"linkedBinaryTree.h"
usingnamespacestd;
template
classindexedBinarySearchTree:
publicindexedBSTree
publiclinkedBinaryTree
{
public:
//methodsofdictionary
boolempty()const{returnthis->treeSize==0;}
intsize()const{returnthis->treeSize;}
pair
voidinsert(constpair
voiderase(constK&theKey);
voiddelete2(int);
//additionalmethodofbsTree
voidascend(){this->inOrderOutput();}
//voidmakeBst(constinta[]);
voideraseMax();//删除关键字最大的元素
};
template
pair
:
get(intIndex)const
{
binaryTreeNode
while(p!
=NULL)
{
if(Index
{
p=p->leftChild;
}
else
{
if(Index>p->leftSize)
{
Index=Index-(p->leftSize+1);
p=p->rightChild;
}
else//foundmatchingpair
return&p->element;
}
}
//nomatchingpair
returnNULL;
}
template
voidindexedBinarySearchTree
:
insert(constpair
{//InsertthePairintothetree.Overwriteexisting
//pair,ifany,withsamekey.
//findplacetoinsert
binaryTreeNode
while(p!
=NULL)
{//examinep->element
pp=p;
//pp作为p的双亲结点
if(thePair.first
{
p->leftSize++;//索引加1
p=p->leftChild;
}
else
{
if(thePair.first>p->element.first)
p=p->rightChild;
else//如果相同
{//替换原来的value
p->element.second=thePair.second;//不对
return;
}
}
}
//getanodeforthePairandattachtopp
binaryTreeNode
=newbinaryTreeNode
if(this->root!
=NULL)//thetreeisnotempty
{
if(thePair.first
{
pp->leftChild=newNode;
//pp->leftSize=1;//索引为1
}
else
pp->rightChild=newNode;
}
else
{
this->root=newNode;
//this->root->leftSize=0;//索引为0
}//insertionintoemptytree
this->treeSize++;
}
template
voidindexedBinarySearchTree
:
erase(constK&theKey)//根据关键字删除
{//Deletethepair,ifany,whosekeyequalstheKey.
//searchfornodewithkeytheKey
binaryTreeNode
*pp=NULL;
while(p!
=NULL&&p->element.first!
=theKey)
{//movetoachildofp
pp=p;
if(theKey
p=p->leftChild;
else
p=p->rightChild;
}
if(p==NULL)
return;//nopairwithkeytheKey
//restructuretree
//handlecasewhenphastwochildren
if(p->leftChild!
=NULL&&p->rightChild!
=NULL)
{//twochildren
//converttozerooronechildcase
//findlargestelementinleftsubtreeofp
binaryTreeNode
*ps=p;//parentofs
while(s->rightChild!
=NULL)
{//movetolargerelement
ps=s;
s=s->rightChild;
}
//movelargestfromstop,can'tdoasimplemove
//p->element=s->elementaskeyisconst
binaryTreeNode
newbinaryTreeNode
(s->element,p->leftChild,p->rightChild);
if(pp==NULL)
this->root=q;
elseif(p==pp->leftChild)
pp->leftChild=q;
else
pp->rightChild=q;
if(ps==p)pp=q;
elsepp=ps;
deletep;
p=s;
}
//phasatmostonechild
//savechildpointerinc
binaryTreeNode
if(p->leftChild!
=NULL)
c=p->leftChild;
else
c=p->rightChild;
//deletep
if(p==this->root)
this->root=c;
else
{//ispleftorrightchildofpp?
if(p==pp->leftChild)
pp->leftChild=c;
elsepp->rightChild=c;
}
this->treeSize--;
deletep;
}
template
voidindexedBinarySearchTree
:
delete2(intIndex)
{//Deletethepair,ifany,whosekeyequalstheKey.
//searchfornodewithkeytheKey
binaryTreeNode
*pp=NULL;
/*if(p==NULL)
return;//nopairwithkeytheKey*/
if(Index>this->treeSize-1)//如果索引值大于节点数减1,则不存在该索引值
return;
while(p&&p->leftSize!
=Index)//寻找索引值为Index的结点
{//movetoachildofp
/*pp=p;
if(theKey
p=p->leftChild;
else
p=p->rightChild;*/
if(Index
{
pp=p;//p的父节点
p->leftSize--;//每向左移动一次索引值减1
p=p->leftChild;
}
else
{
if(Index>p->leftSize)
{
pp=p;//p的父节点
Index=Index-(p->leftSize+1);
p=p->rightChild;
}
/*else//foundmatchingpair
return&p->element;*/
}
}
if(p->leftChild!
=NULL&&p->rightChild!
=NULL)//存在左孩子和右孩子的情况
{//twochildren
//converttozerooronechildcase
//findlargestelementinleftsubtreeofp
binaryTreeNode
*ps=p;//parentofs
while(s->rightChild!
=NULL)//寻找左子树中最大的结点
{//movetolargerelement
ps=s;
//ps->leftSize--;//索引减1
s=s->rightChild;//s为要替换的值
}
//将最大元素s移动到p但不是简单的移动
binaryTreeNode
newbinaryTreeNode
(s->element,p->leftChild,p->rightChild);
if(pp==NULL)//如果要删除的结点是根节点,则直接替换根节点
this->root=q;
elseif(p==pp->leftChild)
pp->leftChild=q;
else
pp->rightChild=q;
if(ps==p)pp=q;
elsepp=ps;
deletep;
p=s;
}
//phasatmostonechild
//savechildpointerinc
binaryTreeNode
if(p->leftChild!
=NULL)
c=p->leftChild;
else
c=p->rightChild;
//deletep
if(p==this->root)
this->root=c;
else
{//ispleftorrightchildofpp?
if(p==pp->leftChild)
pp->leftChild=c;
elsepp->rightChild=c;
}
this->treeSize--;
deletep;
}
//overload< template ostream&operator<<(ostream&out,constpair {out< template voidindexedBinarySearchTree : eraseMax() { binaryTreeNode *pp=NULL; while(p! =NULL) { pp=p; p=p->rightChild; } if(p->leftChild! =NULL) { pp->leftChild=p->leftChild; } this->treeSize--; deletep; } #endif //测试代码 //testbinarysearchtreeclass #include #include"indexedBinarySearchTree.h" usingnamespacestd; intmain(void) { indexedBinarySearchTree y.insert(pair y.insert(pair y.insert(pair y.insert(pair cout<<"Treesizeis"< cout<<"Elementsinascendingorderare"< y.ascend(); pair cout<<"Searchfor3index"< cout< //y.erase(4); y.delete2 (2);//删除索引为2的结点 cout<<"2indexdeleted"< cout<<"Treesizeis"< cout<<"Elementsinascendingorderare"< y.ascend(); s=y.get (2);//查找索引为2的结点 cout<<"Searchfor2index"< //cout< y.delete2 (2);//删除索引为2的结点 cout<<"2deleted"< cout<<"Treesizeis"< cout<<"Elementsinascendingorderare"< y.ascend(); /*//s=y.find(6); cout<<"Searchfor6succeeds"< //cout< //y.erase(6); cout<<"6deleted"< cout<<"Treesizeis"< cout<<"Elementsinascendingorderare"< y.ascend(); //s=y.find (1); cout<<"Searchfor1succeeds"< //cout< y.erase (1); cout<<"1deleted"< cout<<"Treesizeis"< cout<<"Elementsinascendingorderare"< y.ascend();*/ }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 索引 二叉 搜索