二叉查找树(binary search tree)的实现

本文详细介绍了二叉查找树的实现方法,并通过测试案例验证了其实现的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉查找树的实现继承了 二叉树的实现

//二叉查找树的头文件

#ifndef SEARCH_TREE_H_ #define SEARCH_TREE_H_ #include"tree_exception.h" #include"binary_tree.h" class SearchTree :public BinaryTree { public: SearchTree(); SearchTree(const BinaryTree &_tree); virtual ~SearchTree(); virtual void insert(const ItemType &newitem) throw(TreeException); virtual void remove(const ItemType &newitem)throw(TreeException); protected: void insertitem(TreeNode *&treePtr,const ItemType &newitem) throw(TreeException); void removeitem(TreeNode *&treePtr,const ItemType &keyitem)throw(TreeException); void removenode(TreeNode *&treePtr); void processleftmost(TreeNode *&treePtr,ItemType &_item); }; #endif


//二叉查找树的实现文件

#include"search_tree.h" SearchTree::SearchTree() { } SearchTree::SearchTree(const BinaryTree &_tree) :BinaryTree(_tree) { } SearchTree::~SearchTree() {} void SearchTree::insert(const ItemType &newitem) throw(TreeException) { try{ insertitem(rootPtr(),newitem); }catch(TreeException &e) { throw; } } void SearchTree::remove(const ItemType &keyitem)throw(TreeException) { try{ removeitem(rootPtr(),keyitem); }catch(TreeException &e) { throw; } } void SearchTree::insertitem(TreeNode *&treePtr,const ItemType &newitem) throw(TreeException) { if(treePtr==NULL) { treePtr=new TreeNode(newitem,NULL,NULL); if(treePtr==NULL) throw TreeException("calling insert function failed :allocate memory failed "); } else if(treePtr->item>newitem) { insertitem(getLeftPtr(treePtr),newitem); } else insertitem(getRightPtr(treePtr),newitem); } void SearchTree::removeitem(TreeNode *&treePtr,const ItemType &keyitem) throw(TreeException) { if(treePtr==NULL) throw TreeException("calling remove function failed:search key item failed "); else if(treePtr->item==keyitem) { removenode(treePtr); } else if(treePtr->item>keyitem) { removeitem(getLeftPtr(treePtr),keyitem); } else { removeitem(getRightPtr(treePtr),keyitem); } } void SearchTree::removenode(TreeNode *&treePtr) { ItemType replaceitem; if((getLeftPtr(treePtr)==NULL)&&(getRightPtr(treePtr)==NULL)) { delete treePtr; treePtr=NULL; } else if(getLeftPtr(treePtr)==NULL) { TreeNode *temp=treePtr; treePtr=getRightPtr(treePtr); getRightPtr(temp)=NULL; delete temp; } else if(getRightPtr(treePtr)==NULL) { TreeNode *temp=treePtr; treePtr=getLeftPtr(treePtr); getLeftPtr(temp)=NULL; delete temp; } else { processleftmost(getRightPtr(treePtr),replaceitem); treePtr->item=replaceitem; } } void SearchTree::processleftmost(TreeNode *&treePtr,ItemType &_item) { if(getLeftPtr(treePtr)==NULL) { _item=treePtr->item; TreeNode *temp=treePtr; treePtr=getRightPtr(treePtr); getRightPtr(temp)=NULL; delete temp; } else { processleftmost(getLeftPtr(treePtr),_item); } }

//二叉查找树的测试

#include"search_tree.h" #include"binary_tree.h" #include<iostream> using namespace std; void display(ItemType &anitem); int main() { BinaryTree tree1,tree2,left; BinaryTree tree3("hello"); try{ tree1.setRootData("tetrach"); tree1.attachLeft("creature"); tree1.attachRight("vocation"); cout<<"tree1 :"<<endl; tree1.postorderTraverse(display); cout<<endl; tree2.setRootData("prevail"); tree2.attachLeft("dormant"); tree2.attachRightSubtree(tree1); cout<<endl; cout<<"tree2 :"<<endl; tree2.inorderTraverse(display); cout<<endl; BinaryTree binTree("povit",tree2,tree3); cout<<"binTree :"<<endl; binTree.inorderTraverse(display); cout<<endl; cout<<"binTree 's left subtree :"<<endl; binTree.getLeftSubtree().preorderTraverse(display); cout<<endl; binTree.deleteLeftSubtree(left); cout<<endl; cout<<"binTree 's left subtree :"<<endl; left.inorderTraverse(display); cout<<endl<<"binTree after delete :"<<endl; binTree.preorderTraverse(display); cout<<endl; SearchTree * atree=new SearchTree(); atree->insert("inheritor"); atree->insert("arrogate"); atree->insert("diverse"); atree->insert("sacrament"); cout<<endl; cout<<"atree :"<<endl; atree->inorderTraverse(display); atree->remove("arrogate"); cout<<endl; cout<<"atree after removing :"<<endl; atree->inorderTraverse(display); }catch(TreeException &e) { cout<<e.what()<<endl; } return 0; } void display(ItemType &anitem) { cout<<anitem<<" "; }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值