Ex7_13.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例7.13】二叉树类模板(其中二叉树生成借用二叉排序树,见下节)。特别注意
  2. //插入结点时,第二参数为指针的引用!否则不能建立树。为什么?请读者自己思考。
  3. #include<iostream>
  4. #include<cstdlib>
  5. using namespace std;
  6. template<typename T>class BinaryTree;
  7. template<typename T>class Node{
  8. Node<T> *lchild,*rchild;
  9. T info;
  10. public:
  11. Node(){lchild=NULL;rchild=NULL;}
  12. Node(T data,Node<T> *left=NULL,Node<T> *right=NULL){
  13. info=data;
  14. lchild=left;
  15. rchild=right;
  16. }
  17. friend class BinaryTree<T>;
  18. };
  19. template<typename T>class BinaryTree{
  20. Node<T> *root;                  //二叉树的根指针
  21. void InOrder(Node<T> *Current);                //中序遍历
  22. void PreOrder(Node<T> *Current); //前序遍历
  23. void PostOrder(Node<T> *Current); //后序遍历
  24. void Insert(const T &data,Node<T> * &b); //插入结点,参数为引用!
  25. void Destory(Node<T> * Current);        //删除树
  26. public:
  27. BinaryTree(){root=NULL;} //空树构造函数
  28. ~BinaryTree(){Destory(root);} //析构函数
  29. void Creat(T* data,int n);                    //建立(排序)二叉树
  30. void InOrder(){InOrder(root);}                //中序遍历,共有函数为接口
  31. void PreOrder(){PreOrder(root);}       //前序遍历,共有函数为接口
  32. void PostOrder(){PostOrder(root);}   //后序遍历,共有函数为接口
  33. };
  34. template<typename T> void BinaryTree<T>::Destory(Node<T> *Current){
  35. if(Current!=NULL){
  36. Destory(Current->lchild);
  37. Destory(Current->rchild);
  38. delete Current;   //后序释放根结点
  39. }
  40. }
  41. template<typename T>void BinaryTree<T>::Insert(const T &data,Node<T> * &b){
  42. if(b==NULL){ //已到空树,插入
  43. b=new Node<T>(data);
  44. if(b==NULL){
  45. cout<<"空间不足"<<endl;
  46. exit(1);
  47. }
  48. }
  49. else if(data<b->info) Insert(data,b->lchild); //小于,向左子树去查
  50.      else Insert(data,b->rchild); //大于等于,向右子树去查
  51. }
  52. template<typename T>void BinaryTree<T>::Creat(T* data,int n){ //建立一棵二叉排序树
  53. for(int i=0;i<n;i++) Insert(data[i],root);
  54. }
  55. template<typename T>void BinaryTree<T>::InOrder(Node<T> *Current){
  56. if(Current!=NULL){ //递归终止条件
  57. InOrder(Current->lchild); //中序遍历左子树
  58. cout<<Current->info<<'t'; //访问根结点,注意所放位置
  59. InOrder(Current->rchild); //中序遍历右子树
  60. }
  61. }
  62. template<typename T>void BinaryTree<T>::PreOrder(Node<T> *Current){
  63. if(Current!=NULL){
  64. cout<<Current->info<<'t'; //注意前序访问语句所放位置
  65. PreOrder(Current->lchild);
  66. PreOrder(Current->rchild);
  67. }
  68. }
  69. template<typename T>void BinaryTree<T>::PostOrder(Node<T> *Current){
  70. if(Current!=NULL){
  71. PostOrder(Current->lchild);
  72. PostOrder(Current->rchild);
  73. cout<<Current->info<<'t';   //后序访问根结点
  74. }
  75. }
  76. int main(){
  77. const int n=15;
  78. int i,a[n]={10,5,15,8,3,18,13,12,14,16,20,1,4,6,9};
  79. BinaryTree<int> btree;
  80. btree.Creat(a,n);
  81. cout<<"输入数据:"<<endl;
  82. for(i=0;i<n;i++) cout<<a[i]<<'t';
  83. cout<<endl<<"中序:"<<endl;
  84. btree.InOrder();    //中序遍历输出升序
  85. cout<<endl<<"前序:"<<endl;
  86. btree.PreOrder();
  87. cout<<endl<<"后序:"<<endl;
  88. btree.PostOrder();
  89. cout<<endl;
  90. return 0;
  91. }