二叉树的各种遍历
来源:互联网 发布:美国非农业就业数据 编辑:程序博客网 时间:2024/06/09 20:32
#include<iostream>#include<stack>#include<queue>#include<stdio.h>#include<stdlib.h>using namespace std;//二叉树的各种遍历//二叉树的链式存储定义typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//二叉树的创建:通过读入一个字符串,建立二叉树int createBiTree(BiTree &T){ char data; //按先序序列输入二叉树中结点的值(一个字符),“#”表示空树 scanf("%c",&data); if(data == '#'){ T = NULL; } else{ T = (BiTree)malloc(sizeof(BiTNode)); T->data = data; createBiTree(T->lchild); createBiTree(T->rchild); } return 0;}//二叉树的遍历(递归算法)//输出void visit(BiTree T){ if(T->data != '#'){ printf("%c ",T->data); }}//先序遍历void preOrder(BiTree T){ if(T != NULL){ visit(T); preOrder(T->lchild); preOrder(T->rchild); }}//中序遍历void inOrder(BiTree T){ if(T != NULL){ inOrder(T->lchild); visit(T); inOrder(T->rchild); }}//后序遍历void postOrder(BiTree T){ if(T != NULL){ postOrder(T->lchild); postOrder(T->rchild); visit(T); }}//先序遍历的非递归算法//思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再遍历T的右子树void preOrder2(BiTree T){ stack<BiTree> stack; BiTree p = T; while(p || !stack.empty()){ if(p != NULL){ stack.push(p); printf("%c ",p->data); p = p->lchild; } else{ p = stack.top(); stack.pop(); p = p->rchild; } }}//中序遍历非递归算法//思路:T是要遍历树的指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。//先将T入栈,遍历左子树,遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树void inOrder2(BiTree T){ stack<BiTree> stack; BiTree p = T; while(p || !stack.empty()){ if(p != NULL){ stack.push(p); p = p->lchild; } else{ p = stack.top(); printf("%c ",p->data); stack.pop(); p = p->rchild; } }}//后序遍历的非递归算法typedef struct BiTNodePost{ BiTree biTree; char tag;}BiTNodePost,*BiTreePost;void postOrder2(BiTree T){ stack<BiTreePost> stack; BiTree p = T; BiTreePost BT; while(p!= NULL || !stack.empty()){ //遍历左子树 while(p != NULL){ BT = (BiTreePost)malloc(sizeof(BiTreePost)); BT->biTree = p; //访问过左子树 BT->tag = 'L'; stack.push(BT); p = p->lchild; } //遍历完左子树,访问根结点 while(!stack.empty() && (stack.top()->tag == 'R')){BT = stack.top(); //退栈 stack.pop(); BT->biTree; printf("%c ",BT->biTree->data); } //遍历右子树 if(!stack.empty()){ BT = stack.top(); //访问过右子树 BT->tag = 'R'; p = BT->biTree; p = p->rchild; } }}//层序遍历void levelOrder(BiTree T){queue<BiTree> queue;BiTree p = T;queue.push(p);while(!queue.empty()){p = queue.front();printf("%c ",p->data);queue.pop();if(p->lchild != NULL){queue.push(p->lchild);}if(p->rchild != NULL){queue.push(p->rchild);}}} int main(){BiTree T;createBiTree(T);printf("先序遍历:\n"); preOrder(T); printf("\n"); printf("先序遍历(非递归):\n"); preOrder2(T); printf("\n"); printf("中序遍历:\n"); inOrder(T); printf("\n"); printf("中序遍历(非递归):\n"); inOrder2(T); printf("\n"); printf("后序遍历:\n"); postOrder(T); printf("\n"); printf("后序遍历(非递归):\n"); postOrder2(T); printf("\n"); printf("层次遍历:\n"); levelOrder(T); printf("\n"); return 0; }
转载地址:http://blog.csdn.net/sunnyyoona/article/details/24741311
0 0
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树的各种遍历
- 二叉树各种遍历
- 二叉树各种遍历
- 二叉树各种遍历
- 二叉树的各种遍历,二叉树改链表,二叉树复习
- 二叉树的各种遍历【hao】
- 二叉树的各种遍历算法
- 遍历二叉树的各种实现
- 二叉树遍历的各种方式
- 二叉树的构建及各种遍历
- 二叉树遍历的各种算法
- 二叉树的各种非递归遍历
- 算法 二叉树的各种遍历
- C++面向对象编程分享02----20160311_李楚煌
- 自定义View_PercentagerRing
- iOS之引用计数
- ios中使用SegmentedControl来切换视图
- varinish参考手册
- 二叉树的各种遍历
- wmi协议支持远程执行cmd命令,并返回获取命令相关信息
- 开源项目集锦(持续更新)...
- linux下动态链接库(.so)的显式调用和隐式调用
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- Genymotion常见问题
- 看完让你彻底搞懂Websocket原理
- Android APK反编译就这么简单 详解(附图)
- Java NIO使用及原理分析 (一)