BSTree.h
上传用户:fafc_zi
上传日期:2022-07-28
资源大小:3k
文件大小:2k
源码类别:

数据结构

开发平台:

Visual C++

  1. //二叉树类模板(其中二叉树生成产生完全二叉树)。特别注意
  2. //插入结点时,第二参数为指针的引用!否则不能建立树。为什么?请读者自己思考。
  3. #include<iostream>
  4. using namespace std;
  5. template<typename T>class BinaryTree;
  6. template<typename T>class Node{
  7. Node<T> *lchild,*rchild;
  8. T info;
  9. public:
  10. Node(){lchild=NULL;rchild=NULL;}
  11. Node(T data,Node<T> *left=NULL,Node<T> *right=NULL){
  12. info=data;
  13. lchild=left;
  14. rchild=right;
  15. }
  16. friend class BinaryTree<T>;
  17. };
  18. template<typename T>class BinaryTree{
  19. Node<T> *root;                  //二叉树的根指针
  20. void InOrder(Node<T> *Current);                //中序遍历
  21. void Insert(const T &data,Node<T> * &b); //插入结点,参数为引用!
  22. void Destory(Node<T> * Current);        //删除树
  23. int Countdepth(Node<T> *btree);         //树深度计数
  24. public:
  25. BinaryTree(){root=NULL;} //空树构造函数,无头结点
  26. ~BinaryTree(){Destory(root);} //析构函数
  27. void Creat(T data);                    //一步一步建立(排序)二叉树
  28. void InOrder(){InOrder(root);}                //中序遍历,公有函数为接口
  29. int Countdepth(){return Countdepth(root);}      //树深度计数
  30. };
  31. template<typename T> void BinaryTree<T>::Destory(Node<T> *Current){
  32. if(Current!=NULL){
  33. Destory(Current->lchild);
  34. Destory(Current->rchild);
  35. delete Current;   //后序释放根结点
  36. }
  37. }
  38. template<typename T>void BinaryTree<T>::Insert(const T &data,Node<T> * &b){
  39. if(b==NULL){ //已到空树,插入
  40. b=new Node<T>(data);
  41. if(b==NULL){
  42. cout<<"空间不足"<<endl;
  43. exit(1);
  44. }
  45. }
  46. else if(data<b->info) Insert(data,b->lchild); //小于,向左子树去查
  47.      else Insert(data,b->rchild); //大于等于,向右子树去查
  48. }
  49. template<typename T>void BinaryTree<T>::Creat(T data){ //一步一步建立一棵搜索二叉树
  50. Insert(data,root);
  51. }
  52. template<typename T>void BinaryTree<T>::InOrder(Node<T> *Current){
  53. if(Current!=NULL){ //递归终止条件
  54. InOrder(Current->lchild); //中序遍历左子树
  55. cout<<Current->info<<'t'; //访问根结点,注意所放位置
  56. InOrder(Current->rchild); //中序遍历右子树
  57. }
  58. }
  59. template<typename T>int BinaryTree<T>::Countdepth(Node<T> *btree){//树深度
  60. int num1,num2;
  61. if(btree==NULL)return 0;
  62. else if(btree->lchild==NULL&&btree->rchild==NULL)return 1;
  63. else{
  64. num1=Countdepth(btree->lchild)+1;
  65. num2=Countdepth(btree->rchild)+1;
  66. if(num1>num2) return num1;
  67. else return num2;
  68. }
  69. }