二叉树非递归后序遍历
来源:互联网 发布:淘宝二手货市场 编辑:程序博客网 时间:2024/05/22 04:27
什么也不说直接写代码
#include<stack>using namespace std;typedef int DType;typedef struct _BNode{ DType data; _BNode *left, *right;}BNode;typedef stack<BNode*> BNodeStack;typedef void (*bVisit)(DType data);void NoRecursionPostTraverse(BNode* bTree, bVisit visit){ BNodeStack visitStack; if (bTree) { visitStack.push(bTree); } BNode* preNode = NULL; while (!visitStack.empty()) { BNode* temp = visitStack.top(); if ((temp->left == NULL && temp->right == NULL) || (temp->right && preNode == temp->right) || (temp->left&&preNode == temp->left)) { visit(temp->data); preNode = temp; visitStack.pop(); } else { if (temp->right) { visitStack.push(temp->right); } if (temp->left) { visitStack.push(temp->left); } } }}void OutPut(DType data){ printf("%2d\t", data);}int _tmain(int argc, _TCHAR* argv[]){ BNode root; BNode left1; BNode right1; BNode left11; root.data = 0; root.left = &left1; root.right = &right1; left1.data = 10; left1.left = &left11; left1.right = NULL; left11.data = 100; left11.left = NULL; left11.right = NULL; right1.data = 20; right1.left = NULL; right1.right = NULL; NoRecursionPostTraverse(&root, OutPut); return 0;}
执行结果
复习数据结构查了一下网,说二叉树遍历非递归后序遍历是最难理解的,试着写了写,知识就是慢点练习而已。
总体思想是 先入栈右子树,再入栈左子树,达到先后顺序。这里记录上一个遍历的结点是出栈判断用的,如果没有子树直接调用visit,但是有子树就需要遍历完子树才能出栈,如何算遍历完呢,后序遍历的特殊性,如果有右子树,就是右子树,如果没有就是左子树了。
0 0
- 后序遍历二叉树非递归
- 非递归后序遍历二叉树
- 非递归后序遍历二叉树
- 非递归后序遍历二叉树
- 二叉树非递归后序遍历
- 二叉树非递归后序遍历
- 二叉树非递归后序遍历
- 非递归后序遍历二叉树
- 二叉树非递归后序遍历
- 二叉树非递归后序遍历
- 非递归遍历后序二叉树
- 二叉树的后序递归,非递归遍历
- 二叉树遍历-后序遍历(非递归)
- 二叉树非递归后序遍历(非递归遍历中最麻烦的一个)
- 二叉树的非递归前序、后序遍历
- 二叉树的非递归后序遍历
- 二叉树的非递归后序遍历算法
- 非递归实现二叉查找树的后序遍历
- VirtualBox上CentOS系统网络配置
- vmware下CentOS7.0 安装 GCC (GNU 编译器集) 及VMware Tools
- Leetcode 283. Move Zeroes
- EL表达式
- java 多线程详解三 同步函数
- 二叉树非递归后序遍历
- 服务端自动部署静态项目的几种方法
- AngularJS: $httpProvider.defaults.withCredentials = true;
- Android 笔记之 AsyncTask
- NodeJs火车票查询接口0830
- AsyncTask机制实现线程之间的通信
- 框架 day72 Redis入门
- sass实战演练01 - 外部文件引用和变量
- protobuf C#编译