C++二叉搜索树
来源:互联网 发布:mac视频格式转换器 编辑:程序博客网 时间:2024/06/06 18:20
//////二叉搜索树.#include <iostream>using namespace std;template<typename Type>class BSTNode{ public: Type data; BSTNode<Type> *left; BSTNode<Type> *right; BSTNode(Type val = Type()):data(val),left(NULL),right(NULL){}};template<typename Type>class BSTtree{ public: friend istream& operator>>(istream &in,BSTtree<Type> &bst) { Type item; while( in>>item , item != bst.vef) { bst.Insert(bst.root,item); } return in; } BSTtree():vef(-1),root(NULL){} BSTtree(const BSTtree<Type> &bst) { copy(this->root,bst.root); } BSTtree& operator=(const BSTtree<Type> &bst) { if(this!=&bst) { if(root!=NULL) _destory(root);//判断原来是否存在节点,存在则删除该树所有节点,再进行赋值构造. copy(root,bst.root); } return *this; } ~BSTtree() { _destory(root); } bool Insert(Type a[],int n) { for(int i=0;i<n;++i) { Insert(root,a[i]); } } void Printf() { Printf(root); } bool Find(int val) { if(Find(root,val))return true; else return false; } bool Remove(Type val) { return Remove(root,val); } bool Delete(Type val) { return Delete(root,val); } Type Parent(Type val) { BSTNode<Type> *p = Parent(root,val); if(p!=NULL) return GetVal(p); else return -1; } Type GetVal(BSTNode<Type> *t) { return t->data; } private: BSTNode<Type> *Parent(BSTNode<Type> *&t,Type val)//找val的父亲节点. { if(t==NULL || t->data==val)return NULL; if(t->left!=NULL && t->left->data==val)return t; if(t->right!=NULL && t->right->data==val)return t; if(t->data>val) Parent(t->left,val); else { Parent(t->right,val); } } bool Remove(BSTNode<Type> *&t,Type val)//这里删除是搜索一个值代替删除位置的值. { if(t==NULL)return false; else { if(t->data>val) Remove(t->left,val); else if(t->data<val) Remove(t->right,val); else { if(t->left!=NULL && t->right!=NULL) { BSTNode<Type> *tmp = t; BSTNode<Type> *p = t->right; while(p->left!=NULL) p=p->left; t->data = p->data; if(t->right!=NULL) Remove(t->right,p->data); } else { if(t->left==NULL) { BSTNode<Type> *tmp = t; t = tmp->right; delete tmp; tmp = NULL; } else if(t->right==NULL) { BSTNode<Type> *tmp = t; t = tmp->left; delete tmp; tmp = NULL; } else { delete t; t=NULL; } } } } } BSTNode<Type>* Find(BSTNode<Type> *&t,Type val)//按值val查找节点. { if(t==NULL)return NULL; if(t!=NULL) { if(t->data>val) Find(t->left,val); else if(t->data<val) Find(t->right,val); else return t; } } bool _destory(BSTNode<Type> *&t)//摧毁搜索二叉树. { if(t!=NULL) { _destory(t->left); _destory(t->right); delete t; t = NULL; } } bool copy(BSTNode<Type> *&t,BSTNode<Type> *e)//赋值搜索二叉树. { if(e==NULL)return false; if(e!=NULL) { t = new BSTNode<Type>(e->data); copy(t->left,e->left); copy(t->right,e->right); } return true; } bool Insert(BSTNode<Type> *&t,Type val)//插入val。 { if(t==NULL) { t = new BSTNode<Type>(val); } else { if(t->data>val) Insert(t->left,val); else if(t->data<val) Insert(t->right,val); else return false; } return true; } void Printf(BSTNode<Type> *t)//排序打印. { if(t!=NULL) { Printf(t->left); cout<<t->data<<" "; Printf(t->right); } } public: Type Min()//求最小值. { BSTNode<Type> *p = root; if(p==NULL)return vef; while(p->left!=NULL) p=p->left; return p->data; } Type Max()//求最大值. { BSTNode<Type> *p = root; if(p==NULL)return vef; while(p->right!=NULL) p=p->right; return p->data; } private: Type vef; BSTNode<Type> *root;};int main(){ BSTtree<int> bst; cin>>bst;// cout<<bst.Parent(3)<<endl;// cout<<bst.Find(2)<<endl;// int a[]={6,52,4,2,7,86,7,1};// bst.Insert(a,8);// bst.Printf();// cout<<bst.Max()<<endl; bst.Printf(); // fst.Printf();//这里都是测试调用. return 0;}感悟:我本来想将Remove()函数的实现用要删除节点的左分支挂在右边分支的最左端,也可以形成二叉搜索树,只是找寻父节点链接十分麻烦,且增加了二叉树深度,所以我放弃了那个想法,选择了数据删除的方法.
2 0
- 二叉搜索树(c++)
- C语言二叉搜索树
- 二叉搜索树(C++)
- [C++] 实现二叉搜索树
- 二叉搜索树 c 语言实现
- C语言二叉搜索树基本操作
- 二叉搜索树 C语言实现
- C/C++生成二叉树并搜索
- 【C基础】二叉搜索树的实现
- 二叉搜索树(c实现)
- <C/C++数据结构>二叉搜索树
- 二叉搜索树(BST) ----- C语言
- 【C++】实现的二叉搜索树BST
- 数据结构(c++)<二叉搜索树>
- c语言实现:二叉搜索树
- 二叉搜索树(C语言)
- C数据结构-二叉搜索树BSTree
- 二叉树/二叉搜索树的操作汇集(c++)
- Android Adapter 源码笔记(1)
- 算法导论第一题
- 论java环境的重要性
- 网址中#的作用
- Core Data学习
- C++二叉搜索树
- 为什么Logistic regression的代价函数如此?
- linux平台学x86汇编(十四):函数的使用
- Android四大组件
- 在JSP页面中显示List集合·
- 本地时间(北京时间)和“GMT+8”时区时间的区别?
- 递推算法
- Xpath学习心得
- Java基础学习—类与对象