码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树

时间:2019-11-18 09:34:44      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:键盘输入   turn   queue   ase   函数调用   释放   div   二叉链表   open   

技术图片

 

 中序输入:A、B、C、#、#、#、D、#、#

 

二叉树的实现以及四种遍历:

技术图片
  1 #include <iostream>
  2 #include <string>
  3 #include <queue>
  4 using namespace std;
  5 
  6 template<class T>
  7 struct BiNode {
  8     T data;
  9     BiNode<T> *lchild, *rchild;//左子树、右子树
 10 };
 11 
 12 template<class T>
 13 class BiTree
 14 {
 15 public:
 16     BiTree();//构造函数,初始化二叉树,前序序列由键盘输入
 17     ~BiTree();//析构函数,释放二叉链表中的各结点的存储空间
 18     BiNode<T>* Getroot();//获得指向根节点的指针
 19     void PreOrder(BiNode<T>* root);//前序遍历二叉树
 20     void InOrder(BiNode<T>* root);//中序遍历二叉树
 21     void PostOrder(BiNode<T>* root);//后序遍历二叉树
 22     void LeverOrder(BiNode<T>* root);//层序遍历二叉树
 23 private:
 24     BiNode<T> *root;//指向根节点的头指针
 25     BiNode<T> *Great();//有参构造函数调用
 26     void ReLease(BiNode<T> *root);//析构函数调用
 27 };
 28 template<class T>
 29 BiTree<T>::BiTree() {
 30     this->root = Great();//创建对象时,构造函数被调用后,调用Great函数进行初始化
 31 }
 32 
 33 template<class T>
 34 BiTree<T>::~BiTree() {
 35     ReLease(root);//调用ReLease释放二叉树链表
 36 }
 37 
 38 template<class T>
 39 BiNode<T>* BiTree<T>::Getroot() {
 40     return root;//返回根节点地址
 41 }
 42 
 43 template<class T>
 44 void BiTree<T>::PreOrder(BiNode<T>* root) {
 45     if (root == NULL)
 46         return;
 47     cout << root->data << " ";
 48     PreOrder(root->lchild);//前序遍历二叉树(根,左,右)
 49     PreOrder(root->rchild);
 50 }
 51 
 52 template<class T>
 53 void BiTree<T>::InOrder(BiNode<T> *root) {
 54     if (root == NULL)
 55         return;
 56     InOrder(root->lchild);//中序遍历二叉树(左,根,右)
 57     cout << root->data << " ";
 58     InOrder(root->rchild);
 59 }
 60 
 61 template<class T>
 62 void BiTree<T>::PostOrder(BiNode<T>* root) {
 63     if (root == NULL)
 64         return;
 65     PostOrder(root->lchild);//后序遍历二叉树(左,右,根)
 66     PostOrder(root->rchild);
 67     cout << root->data << " ";
 68 }
 69 
 70 template<class T>
 71 void BiTree<T>::LeverOrder(BiNode<T>* root) {
 72     BiNode<T> *p;
 73     if (root == NULL)
 74         return;
 75     queue<BiNode<T>*> q;//include<queue>库,queue类型为BiNode<T>*,函数push,empty,pop,front
 76     q.push(root);
 77     while (!q.empty()) {
 78         p = q.front();
 79         cout << p->data << " ";
 80         q.pop();
 81         if (p->lchild != NULL) {
 82             q.push(p->lchild);
 83         }
 84         if (p->rchild != NULL) {
 85             q.push(p->rchild);
 86         }
 87     }
 88 }
 89 
 90 template<class T>
 91 BiNode<T>* BiTree<T>::Great() {
 92     BiNode<T>* root;
 93     T ch;
 94     cout << "请输入创建的一颗二叉树的结点数据:" << endl;
 95     cin >> ch;
 96     if (ch == "#")
 97         root = NULL;
 98     else {
 99         root = new BiNode<T>;
100         root->data = ch;
101         root->lchild = Great();
102         root->rchild = Great();
103     }
104     return root;
105 }
106 
107 template<class T>
108 void BiTree<T>::ReLease(BiNode<T>* root) {
109     if (root != NULL) {
110         ReLease(root->lchild);
111         ReLease(root->rchild);
112         delete root;
113     }
114 }
115 
116 
117 int main()
118 {
119     BiTree<string> bt;//创建一棵树
120     BiNode<string>* root = bt.Getroot();
121     
122     cout << "------前序遍历------" << endl;
123     bt.PreOrder(root);
124     cout << endl;
125     cout << "------后序遍历------" << endl;
126     bt.PostOrder(root);
127     cout << endl;
128     cout << "------中序遍历------" << endl;
129     bt.InOrder(root);
130     cout << endl;
131     cout << "------层序遍历------" << endl;
132     bt.LeverOrder(root);
133     cout << endl;
134 
135     system("pause");
136     return 0;
137 }
View Code

 

  

二叉树

标签:键盘输入   turn   queue   ase   函数调用   释放   div   二叉链表   open   

原文地址:https://www.cnblogs.com/guoyujiang/p/11880137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!