6.4二叉树的遍历-非递归
来源:互联网 发布:手机化妆软件下载 编辑:程序博客网 时间:2024/06/01 09:48
6.4二叉树的遍历-非递归
一.了解递归
了解了递归中操作系统做了什么,非递归的实现也就不难理解了。
在系统调用函数时,需完成三件事:
(1)将实参、返回地址传递给被调用函数保存。
(2)为被调用函数等分配存储区。
(3)控制转移到被调用函数入口。
被调用函数返回主调函数,系统也需完成三件事:
(1)保存被调函数返回值。
(2)释放被调函数数据区。
(3)依照被调函数保存的地址控制转移到主调函数
二.二叉树遍历的非递归实现
(0)二叉树的创建 见6.1二叉树的创建
二叉树的递归遍历 见6.2二叉树的遍历
(1)用栈模拟递归,二叉树的非递归遍历依然分三种。
A.LDR中序遍历
void inorder(Stack &S, BiTree &t){BiTree p = t;while( p || S.top != S.bottom){if(p){push(S,p);p = p -> lchild;}else{pop(S,p);printf("%c ",p -> data);p = p -> rchild;}}}
B.DLR先序遍历
void preorder(Stack &S, BiTree &t){BiTree p = t;while( p || S.top != S.bottom){if(p){printf("%c ",p -> data);push(S,p);p = p -> lchild;}else{pop(S,p);p = p -> rchild;}}}
C.LRD后序遍历(较复杂)
<span style="font-size:18px;">void postorder(Stack &S, BiTree &t){BiTree p = t;BiTree cur;BiTree pre = p;push(S,p);while(S.top != S.bottom){cur = *(S.top-1); if((cur->lchild==NULL&&cur->rchild==NULL)|| (pre!=NULL&&(pre==cur->lchild || pre==cur->rchild))) { printf("%c ",cur -> data); //如果当前结点没有孩子结点或者孩子节点都已被访问过 pop(S,cur); pre = cur; } else { if(cur->rchild != NULL) push(S,cur -> rchild); if(cur->lchild != NULL) push(S,cur -> lchild); }}}</span>
三.完整程序源代码
/* 样例输入:abc##de#g##f### */#include<iostream>#include<stdlib.h>#define len (sizeof(BiNode))#define OK 1typedef struct bintree{struct bintree *lchild, *rchild;char data;} BiNode, *BiTree;BiTree t;//头结点指针typedef struct stack{BiTree *top;BiTree *bottom;int stacksize;}Stack;Stack S;int bintree_creat(BiTree &q);void InitStack(Stack &S);void visit(BiTree t);void preorder(Stack &S, BiTree &t);void inorder(Stack &S, BiTree &t);void postorder(Stack &S, BiTree &t);void push(Stack &S, BiTree &p);void pop(Stack &S, BiTree &p);int main(){printf("input node data :");bintree_creat(t);InitStack(S);visit(t);return 0;}int bintree_creat(BiTree &q){char n;n = getchar();if(n == '#')q = NULL;else{q = (BiTree )malloc(len);q->data = n;bintree_creat(q -> lchild);bintree_creat(q -> rchild);}return OK;}void InitStack(Stack &S){printf("input stacksize :");scanf("%d",&S.stacksize);S.bottom = S.top = (BiTree *)malloc(S.stacksize*sizeof(BiTree ));}void visit(BiTree t){int i;while(1){printf("\n\ninput 1 : preorder the tree !\ninput 2 : inorder the tree !\ninput 3 : postorder the tree !\ninput 0 to exit\n\n");scanf("%d",&i);switch (i){case 1 :preorder(S,t); break;case 2 :inorder(S,t); break;case 3 :postorder(S,t); break;case 0 :exit(0);default:printf("input error !");break;}}}void preorder(Stack &S, BiTree &t){BiTree p = t;while( p || S.top != S.bottom){if(p){printf("%c ",p -> data);push(S,p);p = p -> lchild;}else{pop(S,p);p = p -> rchild;}}}void inorder(Stack &S, BiTree &t){BiTree p = t;while( p || S.top != S.bottom){if(p){push(S,p);p = p -> lchild;}else{pop(S,p);printf("%c ",p -> data);p = p -> rchild;}}}void postorder(Stack &S, BiTree &t){BiTree p = t;BiTree cur;BiTree pre = p;push(S,p);while(S.top != S.bottom){cur = *(S.top-1); if((cur->lchild==NULL&&cur->rchild==NULL)|| (pre!=NULL&&(pre==cur->lchild || pre==cur->rchild))) { printf("%c ",cur -> data); //如果当前结点没有孩子结点或者孩子节点都已被访问过 pop(S,cur); pre = cur; } else { if(cur->rchild != NULL) push(S,cur -> rchild); if(cur->lchild != NULL) push(S,cur -> lchild); }}}void push(Stack &S, BiTree &p){*S.top++ = p;}void pop(Stack &S, BiTree &p){p = * --S.top;}
参考:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
0 0
- 6.4二叉树的遍历-非递归
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- linux下编译libcurl
- Struts1、Struts2和SpringMVC剖析
- Android OpenGL ES 简明开发教程五:添加颜色
- POJ-1330-Nearest Common Ancestors 解题报告
- 衡量和测试特征选择方法的稳定性两种方法理解
- 6.4二叉树的遍历-非递归
- ORA-14551: 无法在查询中执行 DML 操作
- android 屏幕适配
- Linux笔记整理——命令篇
- 使用STL reserve()的必要性
- Android高效加载大图、多图解决方案,有效避免程序OOM
- iOS7后台机制大解析
- 【Android】app 启动 白屏 黑屏解决方案
- redis学习及实践5---redis相关资料参考文献