二叉树前后中序遍历的非递归实现
2014-12-10 15:05
357 查看
其中前序和中序,简单且容易理解。后序遍历有难度。
#include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h" typedef struct BiNode { char data; struct BiNode *lchild,*rchild; }BiNode,*LinkBiTree; typedef struct stack { LinkBiTree *elem;//开辟空间去存贮链的结点,相当于是个顺序链表 int top; int size;//顺序栈的大小,防止溢出 }SqStack; //栈初始化 void InitStack(SqStack &s) { s.elem=(LinkBiTree*)malloc(sizeof(BiNode)*100);//给这个实例化的s的栈的元素分配100大小的空间; s.top=-1; s.size=100; } void push (SqStack &s,LinkBiTree e) { if (s.top==99) printf("栈满!"); else { s.top++; s.elem[s.top]=e; } } LinkBiTree pop(SqStack &s,LinkBiTree e) { if(s.top==-1) printf("栈空!"); else { e=s.elem[s.top]; s.top--; } return e; } //递归算法创建二叉树 void CreatTree(LinkBiTree &T) { char ch; ch=getchar(); if(ch=='#') { T=NULL; return; } else { T=new BiNode;//链表式的二叉树,每一个结点都需要开辟空间给它 T->data=ch; CreatTree(T->lchild); CreatTree(T->rchild); } } void preorder (LinkBiTree &T) { LinkBiTree p;//结点p SqStack s;//栈s; InitStack(s);//初始化栈 p=T;//同样类型的结点指针指向树结点; if (T==NULL)//边界条件要考虑到啊 { printf("空树!");} while(p||!(s.top==-1))//树结点存在且栈不为空,因为不停的入栈出栈,直到所有结点都出栈才算完 { if (p) { push(s,p); printf("%c ",p->data); p=p->lchild;//左子节点为空时,因为栈还不为空,循环会继续 } else { p=pop(s,p); p=p->rchild; } } } void midorder ( LinkBiTree &T) { LinkBiTree p;//结点p SqStack s;//栈s; InitStack(s);//初始化栈 p=T;//同样类型的结点指针指向树结点; if (T==NULL)//边界条件要考虑到啊 { printf("空树!");} while(p||!(s.top==-1))//树结点存在且栈不为空,因为不停的入栈出栈,直到所有结点都出栈才算完 { if (p) { push(s,p); p=p->lchild;//左子节点为空时,因为栈还不为空,循环会继续 } else { p=pop(s,p); printf("%c ",p->data); p=p->rchild; } } } void backorder(LinkBiTree &T)//后序遍历比较难 { LinkBiTree p;//结点p SqStack s;//栈s; InitStack(s);//初始化栈 p=T;//同样类型的结点指针指向树结点; int flag[100];//用于标记右子树是否已经访问。这是后序遍历难度的体现 if (T==NULL)//边界条件要考虑到啊 { printf("空树!"); } else { while (p!=NULL || s.top!=-1) { while (p!=NULL) { push(s,p); flag[s.top]=0; p=p->lchild; } while (!(s.top==-1)&&flag[s.top]==1) { p=pop(s,p); printf("%c ",p->data); } if (!(s.top==-1)) { flag[s.top]=1; //设置标记右子树已经访问 p=s.elem[s.top]; p=p->rchild; } else break; } } } int main() { LinkBiTree t; CreatTree(t); printf("前序遍历:\n"); preorder(t); printf("\n"); printf("中序遍历:\n"); midorder(t); printf("\n"); printf("后序遍历:\n"); backorder(t); system("pause"); return 0; }
相关文章推荐
- 算法导论第十章习题10.4-3非递归方式实现二叉树的中序遍历
- 14.二叉树 中序遍历 先序遍历 的非递归实现 以及 二叉树 的复制 及判断二叉树的等价性
- 二叉树之中序遍历的递归和迭代实现
- 二叉树(一) 先序遍历、中序遍历、后续遍历、层次遍历的递归与非递归实现
- 利用非递归方法实现二叉树的中序遍历
- 二叉树先序遍历,中序遍历和后序遍历的非递归实现
- 二叉树的中序遍历、递归实现、非递归实现、层次遍历、二叉树的应用,来来来,都有都有
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树的非递归实现中序遍历
- Binary Tree Inorder Traversal-非递归实现中序遍历二叉树
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- 二叉树的先序遍历、中序遍历、后序遍历、层次遍历的递归实现
- 递归实现和非递归实现中序遍历二叉树
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- 试编写一个函数,返回一颗给定二叉树在中序遍历下的最后一个节点(分别用递归和非递归实现)
- 二叉树(2)----中序遍历,递归和非递归实现
- 二叉树基础之前序遍历、中序遍历、后序遍历的递归和非递归实现
- 先序遍历、中序遍历二叉树非递归实现
- 二叉树的实现&&递归和非递归方式前序、中序、后续遍历&&发现一个节点中序遍历的下一节点