二叉树后序遍历的非递归算法(C语言)
首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归)
这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远!
折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点。都比较麻烦没有调试成功。若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况。从借鉴的博文里,摘录并改写为C的代码,基本上没有改动。后续问题努力写出自己的原创代码。
二叉树存储的数据类型为int型,用数字0表示子树为空
输入:1 2 3 0 8 0 0 4 0 0 5 6 0 0 7 0 0
得到后序遍历结果:83426751



#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MaxSize 100
typedef int ElemType;
typedef int Status;
typedef struct BTNode{
ElemType data;
struct BTNode *lchild,*rchild;
}BTree;
typedef struct St{
struct BTNode* data[MaxSize];
int top;
}Stack;
//1.按先序次序生成二叉树
BTree* CreateT(){
BTree *BT;
ElemType ch;
scanf("%d",&ch);
)
BT=NULL;
else{
BT=(BTree*)malloc(sizeof(BTree));
if(!BT){exit(OVERFLOW);}
BT->data=ch;
BT->lchild=CreateT();
BT->rchild=CreateT();
}
return BT;
}
//4.后序遍历
Status PostOrder(BTree *BT) {
if(BT){
PostOrder(BT->lchild);
PostOrder(BT->rchild);
printf("%3d",BT->data);
return OK;
}
else return ERROR;
}
//4.后序遍历-非递归
Status PostOrder2(BTree *BT) {
Stack s,s2;
BTree *T;
int flag[MaxSize];
s.top=;
T=BT;
||T){
while(T)
{
s.data[s.top++]=T;
flag[s.top-]=;
T=T->lchild;
}
&&flag[s.top-]==){
T=s.data[--s.top];
printf("%3d",T->data);
}
){
flag[s.top-]=;
T=s.data[s.top-];
T=T->rchild;
}
else break;
}
return OK;
}
int main(){
BTree *BT;
BT=CreateT();
if(PostOrder(BT)){
printf("\n后序遍历完成!\n");
}
if(PostOrder2(BT)){
printf("\n非递归后序遍历完成!\n");
}
}
//-------------------------华丽的分割线-------------------------------------
下面是我自己写的后序遍历程序
//非递归后序遍历-test
void PostOrder3(BTree *T){
BTree *p=T;Stack s;s.top=-;
int tag[MaxSize];
){
if(p){
s.data[++s.top]=p;
tag[s.top]=;
p=p->lchild;
}
else{
){
p=s.data[s.top--];
printf("%d",p->data);
}
p=s.data[s.top];
p=p->rchild;
tag[s.top]=;
}
) break;
}
}
二叉树后序遍历的非递归算法(C语言)的更多相关文章
- BFS、DFS、先序、中序、后序遍历的非递归算法(java)
一 广度优先遍历(BFS) //广度优先遍历二叉树,借助队列,queue public static void bfs(TreeNode root){ Queue<TreeNode> qu ...
- 前序 中序 后序 遍历 递归 非递归算法 java实现
前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...
- LeetCode 145 二叉树的后序遍历(非递归)
题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1 ...
- LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard
题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...
- [Leetcode] Binary tree postorder traversal二叉树后序遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- lintcode.68 二叉树后序遍历
二叉树的后序遍历 描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的后序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...
- 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
- 数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)
Problem Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据. ...
随机推荐
- Django学习笔记(五)—— 表单
疯狂的暑假学习之 Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path ...
- TinyXml 快速入门(三)
在<TinyXml 快速入门(二)>介绍使用tinyxml库获取xml文件声明,查询指定节点.删除指定节点的做法.在本文中继续介绍修改指定节点和增加节点的做法. 修改节点其实和查询指定节点 ...
- 初识web01
Tomcat 服务器 B/S 浏览器/服务器 C/S 客户端/服务器 URI:统一资源标识符 大 广 /项目名 URL:统一资源定位符 ...
- MVC4数据访问EF查询linq语句的时候报错找不到表名问题
一天做项目的时候遇到这样的问题,MVC4用EF访问数据查询用linq语句的时候报错找不到表名:报错如下图: 研究了几种情况,最后还是没有找到正真的问题所在,不过可能是和路由解析问题有关,暂时还没有进行 ...
- hdu 5062
题意:将10^0-10^6之间属于 "Beautiful Palindrome Number" 的数个数打印出来,所谓 "Beautiful Palindrome Nu ...
- poj 1595
#include <iostream> #define N 10010 using namespace std; int a[N],b[N]; int prime(int a) { int ...
- .Net使用SSH.NET通过SSH访问Linux主机
使用了SSH.NET库,添加引用dll至项目,以下代码显示了点击按钮后SSH链接Linux主机执行命令并返回命令执行结果 protected void btnExcute_Click(object s ...
- VIM打开文件与保存文件
打开文件 VIM /etc/inittab 默认的安装没有设置ctrl_W为退出.也可以设置::map <C-W> :close<CR> 或:map <C-W> : ...
- PHP Calendar 函数
PHP 5 Calendar 函数 函数 描述 cal_days_in_month() 针对指定的年份和历法,返回一个月中的天数. cal_from_jd() 把儒略日计数转换为指定历法的日期. ca ...
- 常用shell笔记
一. vi 编辑文件 1. 删除字符:在只读模式下,X:大字的X,每按一次删除光标所在位置的前面一个字符:x:小写字母x 每按一次删除光标所在位置的后面一个字符 2. 进入编辑模式:i.a.o切换进 ...