ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[数据结构] 二叉树

2020-07-04 21:40:39  阅读:236  来源: 互联网

标签:lChild NULL void subTree BTNode 二叉树 rChild 数据结构


  1 数据结构的练习与巩固
  2 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3 #include<iostream>
  4 using namespace std;
  5 
  6 template <class T> 
  7 struct BTNode
  8 {                                               //二叉树结点类定义
  9        T data;                                  //数据域
 10     BTNode<T> *lChild, *rChild;
 11                                                 //左子女、右子女链域
 12     BTNode ()                                   //构造函数
 13        { 
 14                lChild = NULL;  
 15                rChild = NULL; 
 16        }
 17        
 18     BTNode (T& x, BTNode<T> *l = NULL, BTNode<T> *r = NULL)
 19        { 
 20             data = x;  
 21             lChild = l;  
 22             rChild = r; 
 23        }
 24 };
 25 
 26 //二叉树类定义
 27 template <class T> 
 28 class BT 
 29 {            
 30 public:
 31      BTNode<T> *root;          //二叉树的根指针
 32      T RefValue;               //数据输入停止标志
 33 public:
 34         
 35     BT () : root (NULL) {}                          //构造函数
 36     BT (T value) : RefValue(value), root(NULL) {}   //构造函数
 37  
 38     BTNode<T> *lChild (BTNode<T> *t)
 39        { return (t != NULL)?t->lChild : NULL; }     //返回左子女
 40     BTNode<T> *rChild (BTNode<T> *t)
 41        { return (t != NULL)?t->rChild : NULL; }     //返回右子女
 42                                                           
 43     bool IsEmpty() { return root == NULL; }         //判二叉树空否                                                          
 44     BTNode<T> * & getRoot () { return root; }       //取根
 45      
 46     void PreOrder (BTNode<T>*& subTree);            //前序遍历
 47     void InOrder  (BTNode<T>*& subTree);            //中序遍历
 48     void postOrder(BTNode<T>*& subTree);            //后序遍历
 49     
 50     void CreateBT(BTNode<T>* & subTree);
 51     void BSTinsert(BTNode<T> *&BT, int Key);
 52     
 53     void Size (BTNode<T> * &subTree,int &count);    //返回结点数
 54     
 55     void leaf (BTNode<T> * &subTree,int &count);    //返回叶子数
 56 };
 57 
 58 template<class T>
 59 void BT<T>::PreOrder(BTNode<T>* &subTree)
 60 {
 61     if (subTree != NULL)
 62     {
 63         cout << subTree->data <<' ';
 64         PreOrder(subTree->lChild);
 65         PreOrder(subTree->rChild);
 66     }
 67 }
 68 
 69 template<class T>
 70 void BT<T>::InOrder(BTNode<T>* &subTree)
 71 {
 72     if (subTree != NULL)
 73     {
 74         InOrder(subTree->lChild);
 75         cout << subTree->data <<' ';
 76         InOrder(subTree->rChild);
 77     }
 78 }
 79 
 80 template<class T>
 81 void BT<T>::postOrder(BTNode<T>*& subTree)
 82 {
 83     if (subTree != NULL)
 84     {
 85         postOrder(subTree->lChild);
 86         postOrder(subTree->rChild);
 87         cout << subTree->data <<' ';
 88     }
 89 }
 90 
 91 //前序创建二叉树
 92 template<class T>
 93 void BT<T>::CreateBT(BTNode<T>*&subTree)               //注意用引用接收指针  如果只传入指针 形参的指针指向改变 实参不会变
 94 {
 95     T ch;
 96     cin >> ch;
 97         if (ch == RefValue) subTree = NULL;
 98         else
 99         {
100             subTree = new BTNode<T>(ch);                    //有参构造函数 建立结点
101             CreateBT(subTree->lChild);                      //递归
102             CreateBT(subTree->rChild);
103         }
104 }
105 
106 template<class T>
107 void BT<T>::Size (BTNode<T> * &subTree,int &count)
108 {
109     if (subTree != NULL)
110     {
111         count++;
112         Size(subTree->lChild,count);
113         Size(subTree->rChild,count);
114     }
115     else
116     return;
117 }
118 
119 template<class T>
120 void BT<T>::leaf (BTNode<T> * &subTree,int &count)
121 {
122     if(subTree!=NULL)
123     {
124         if(subTree->lChild==NULL && subTree->rChild==NULL)
125         {
126             count++;
127             return;
128         }
129         else
130         {
131             leaf(subTree->lChild,count);
132             leaf(subTree->rChild,count);
133         }    
134     }
135 }
136 
137 int main()
138 {
139     int c1=0,c2=0;
140     BT<char> t('#');
141     t.CreateBT(t.getRoot());
142         cout<<"前序遍历"<<endl; 
143     t.PreOrder(t.getRoot());
144         cout<<endl<<"中序遍历"<<endl;
145     t.InOrder(t.getRoot());
146         cout<<endl<<"后序遍历"<<endl;
147     t.postOrder(t.getRoot());
148     t.Size(t.getRoot(),c1);
149         cout<<endl<<"结点总个数:"<<c1<<endl;
150     t.leaf(t.getRoot(),c2);
151     cout<<"叶子结点总个数:"<<c2<<endl;
152 }

 

标签:lChild,NULL,void,subTree,BTNode,二叉树,rChild,数据结构
来源: https://www.cnblogs.com/nagishiro/p/13236747.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有