二叉树的建立和基础操作<三> —— (三种遍历及分层打印)

来源:互联网 发布:linux telnet命令 编辑:程序博客网 时间:2024/05/19 20:57
#include<iostream>#include<vector>#include<queue>#include<math.h> #include<string.h>#include<algorithm> using namespace std;typedef struct BinaryTree{char val;struct  BinaryTree *left;struct  BinaryTree *right;}BinaryTree,*BitTree;//******递归建立二叉树*****// //先建立根节点,再建立左子树,最后建立右子树/***********测试用例:         a    b         c  #    d    #    e     f   #     #   #   #   #输入:ab#df###c#e##  ***************/int create_tree(BitTree &T){char val = getchar();if(val == '#')T = NULL;else  {T = new BinaryTree;T -> val = val;create_tree(T->left);create_tree(T->right);}return 0;}//*****前序递归遍历二叉树*****//void Preorder(BitTree T){if(T){cout<<T->val<<" ";Preorder(T->left);Preorder(T->right);}}//*****中序递归遍历二叉树*****// void Midorder(BitTree T) { if(T){Midorder(T->left);cout<<T->val<<" ";Midorder(T->right);} }  //*****后序递归遍历二叉树*****// void behindorder(BitTree T){if(T){behindorder(T->left);behindorder(T->right);cout<<T->val<<" ";}}  //*****按层遍历*****////设置游标last,分层打印二叉树 int layerorder_1(BitTree T){vector<BitTree> vec;vec.push_back(T);int cur = 0;int last = 1;while(cur < vec.size()){last = vec.size();//设置last游标 while(cur < last) //当last == cur时,退出循环,打印回车 {cout<<vec[cur]->val<<" ";if(vec[cur]->left)vec.push_back(vec[cur]->left);if(vec[cur]->right)vec.push_back(vec[cur]->right);cur++;}cout<<endl;}return 0;}//改写BFS,分层打印二叉树  int layerorder_2(BitTree T)  {int parentSize = 1, childSize = 0;BitTree temp;queue<BitTree > q;q.push(T);do{temp = q.front();cout<<temp->val<<" ";q.pop();parentSize--; //每次pop一个节点,parentSize减去1 if(temp->left){q.push(temp->left);childSize++;}if(temp->right){q.push(temp->right);childSize++;}if(parentSize == 0) //当根节点出栈完毕时,表示本层可以输出回车了    {                    //此时更新下一层parentSize,将childSize写入 parentSize = childSize; //childSize 赋值为0 childSize = 0;cout<<endl;} }while(!q.empty());return 0;}int main(){BitTree T;create_tree(T);cout<<"前序遍历结果(递归):"<<endl; Preorder(T);cout<<endl<<"中序遍历结果(递归):"<<endl;Midorder(T);cout<<endl<<"后序遍历结果(递归):"<<endl;behindorder(T);cout<<endl<<"层次遍历结果1:"<<endl; layerorder_1(T);cout<<endl<<"层次遍历结果2:"<<endl; layerorder_2(T);return 0;}

程序运行结果:


0 0
原创粉丝点击