c++ 二叉树的构建 前序遍历 中序遍历 后续遍历 层次遍历
2016-09-14 07:58
721 查看
#include<iostream> #include<vector> #include<queue> using namespace std; // 定义二叉链表节点类型 template<class T> struct Node { T data; Node *lchild; Node *rchild; }; // 二叉树链表类 template<class T> class Binary_Tree { private: Node<T> *BT; // 二叉链表的根节点 public: Binary_Tree(){BT = NULL; return;} // 二叉链表初始化 void Creat_Binary_Tree(T); // 生成二叉链表类 void Pretrav_Binary_Tree(); // 二叉树前序遍历 void Intrav_Binary_Tree(); // 二叉树中序遍历 void Postrav_Binary_Tree(); void Print_By_Level(); // 层次遍历 void Print_By_Level_1(); // 层次遍历 }; // 生成二叉链表 template<class T> void Binary_Tree<T>::Creat_Binary_Tree(T end) // end 为结束符标志 { Node<T> *p; T x; cin>>x; if(x == end)return; p = new Node<T>; p->data = x; p->lchild = NULL; p->rchild = NULL; BT = p; Creat(p, 1, end); Creat(p, 2, end); } template<class T> int Creat(Node<T> *p, int k, T end) { Node<T> *q; T x; cin>>x; if(x != end) { q = new Node<T>; q->data = x; q->lchild = NULL; q->rchild = NULL; if(k == 1)p->lchild = q; if(k == 2)p->rchild = q; Creat(q, 1, end); Creat(q, 2, end); } return 0; } template<class T> void Binary_Tree<T>::Pretrav_Binary_Tree() // 二叉树前序遍历 { Node<T> *p; p = BT; pretrav(p); cout<<endl; return; } template<class T> int pretrav(Node<T> *p) { if(p != NULL) { cout<<p->data<<" "; pretrav(p->lchild); pretrav(p->rchild); } return 0; } template<class T> void Binary_Tree<T>::Intrav_Binary_Tree() // 二叉树中序遍历 { Node<T> *p; p = BT; intrav(p); cout<<endl; return; } template<class T> int intrav(Node<T> *p) { if(p != NULL) { intrav(p->lchild); cout<<p->data<<" "; intrav(p->rchild); } return 0; } template<class T> void Binary_Tree<T>::Postrav_Binary_Tree() // 二叉树的后序遍历 { Node<T> *p; p = BT; postrav(p); cout<<endl; return; } template<class T> int postrav(Node<T> *p) { if(p != NULL) { postrav(p->lchild); postrav(p->rchild); cout<<p->data<<" "; } return 0; } // 二叉树的层次遍历 // 1, 设置两个标志 一个用来记录该层 需要新增的结点数,一个就是,下一层的数组添加数 // 2 当遍历该层的时候,若子结点有,就+1 ,并将该结点添加到数组中; // 3 把该结点新添加的 template<class T> void Binary_Tree<T>::Print_By_Level() { Node<T> *pHead = BT; vector<Node<T>*> vec; vec.push_back(pHead); int cur = 0; int end = 1; while(cur < vec.size()) { end = vec.size(); while(cur < end) { cout<<vec[cur]->data<<" "; if(vec[cur]->lchild) vec.push_back(vec[cur]->lchild); if(vec[cur]->rchild) vec.push_back(vec[cur]->rchild); cur++; } cout<<endl; } } /* 二叉树的层次遍历2 在遍历当前层的时候,保存下一层的结点数,只需要每次插入一个结点的时候childSize++ ,这样就知道了下一层 的结点数了,让后把 childSize 赋值给parentSize ,开始新的一层遍历,从队列中取出parentSize 个结点后,一盒就知道这一层遍历完了。 */ template<class T> void Binary_Tree<T>::Print_By_Level_1() { int parentSize = 1, childSize = 0; Node<T> *temp; queue<Node<T> *> ivec; ivec.push(BT); do { temp = ivec.front(); cout<<temp->data<<' '; ivec.pop(); if(temp->lchild) { ivec.push(temp->lchild); childSize++; } if(temp->rchild) { ivec.push(temp->rchild); childSize++; } parentSize--; if(parentSize == 0) { parentSize = childSize; childSize = 0; cout<<endl; } }while(!ivec.empty()); } int main() { Binary_Tree<int> b; cout<<"输入各结点数值(-1为结束符值)"<<endl; b.Creat_Binary_Tree(-1); cout<<"前序遍历:"<<endl; b.Pretrav_Binary_Tree(); cout<<"中序遍历:"<<endl; b.Intrav_Binary_Tree(); cout<<"后序遍历:"<<endl; b.Postrav_Binary_Tree(); cout<<"层次遍历:"<<endl; //b.Print_By_Level(); b.Print_By_Level_1(); // system("pause"); return 0; } // //void print_by_level_3(Tree T) { // vector<tree_node_t*> vec; // vec.push_back(T); // int cur = 0; // int end = 1; // while (cur < vec.size()) { // end = vec.size(); // while (cur < end) { // cout << vec[cur]->data << " "; // if (vec[cur]->lchild) // vec.push_back(vec[cur]->lchild); // if (vec[cur]->rchild) // vec.push_back(vec[cur]->rchild); // cur++; // } // cout << endl; // } //}
相关文章推荐
- C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历
- 编程实现二叉树的建立,前序遍历,中序遍历和后续遍历
- 由前序遍历与中序遍历生成二叉树及二叉树的前序,中序,后续,层序遍历
- 对二叉树进行前序遍历、中序遍历、后续遍历
- 中序遍历,层次遍历构建二叉树
- 【C++】根据二叉树的前序遍历和中序遍历构建一棵完整的树
- java实现二叉树的构建以及三种遍历方法(先序遍历,中序遍历,后续遍历)
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- java版本_二叉树(前序遍历,中序遍历,后续遍历)
- 二叉树 前序遍历、中序遍历、后续遍历
- 根据前序遍历、中序遍历构建二叉树,并后序遍历输出。
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- 二叉树--前序遍历、中序遍历、后序遍历、层次遍历
- C++二叉树的构建及求深度,叶子数量,层次遍历
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- python实现二叉树,前序遍历,中序遍历,后续遍历
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- C++数据结构--二叉树的建立,前序遍历,中序遍历和后序遍历
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 二叉树先序遍历,中序遍历,后续遍历 非递归版本+二叉树转换为string保存+二叉树的层次遍历+平衡二叉树判断