数据结构------后序遍历,不用栈实现和用栈实现
树的类:
//树的节点
struct Node
{Node(int v = 0) :val(v),left(nullptr),right(nullptr) {};int val;Node *left;Node *right;
};
递归:
//后序遍历----递归
void postorder_recursion(Node *node)
{if (node){if (node->left)postorder_recursion(node->left);if (node->right)postorder_recursion(node->right);cout << node->val << " ";}
}
非递归,用栈实现:
//后序遍历----循环void postorder_stack(Node* root) {if (!root) return;stack<Node*> postorder_s;Node* current = root;postorder_s.push(current);postorder_s.push(current); // 每个结点 push 两次,这样可以简单的判断出哪些结点是否处理过while (!postorder_s.empty()) {current = postorder_s.top();postorder_s.pop();if (!postorder_s.empty() && current == postorder_s.top()) { //当处理过了,那么就不会再次进行孩子压栈了if (current->right) {postorder_s.push(current->right);postorder_s.push(current->right);}if (current->left) {postorder_s.push(current->left);postorder_s.push(current->left);}}else {cout<<current->val<< " ";}}
}
下面是一种很好的思路:
//树的后序遍历 左右中
//因为先序遍历是中左右,如果将左右子树调个存,则就是中右左,然后将其不打印,存入栈中,
//正好是逆序输出,为左右中
void tail_sort(TreeNode<int> *head)
{if (head) return;stack< TreeNode<int>*> pri;stack< TreeNode<int>*> inv_pri;pri.push(head);inv_pri.push(head);while (!pri.empty()){TreeNode<int>* node = pri.top();pri.pop();if (node->right) {pri.push(node->right);inv_pri.push(node->right);}if (node->left) {pri.push(node->left);inv_pri.push(node->left);}}while (!inv_pri.empty()){cout << inv_pri.top()->val << endl;inv_pri.pop();}}
数据结构------后序遍历,不用栈实现和用栈实现相关推荐
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
一.非递归后序遍历算法思想 后序遍历的非递归算法中节点的进栈次数是两个,即每个节点都要进栈两次,第二次退栈的时候才访问节点. 第一次进栈时,在遍历左子树的过程中将"根"节点进栈,待 ...
- 【二叉树的前序、中序、后序遍历的python写法】借助栈的实现,效率媲美递归~
class TreeNode:def __init__(self,val=0,left=None,right=None):self.val = valself.right = rightself.le ...
- “后序遍历二叉运算树进行Lambda演算的化简”带来的联系
今天闲来无事,想到一个自以为绝妙的想法,那就是用后序遍历二叉树Lambda演算的化简. 数据结构与算法中,我们想写个计算器就必须遇到一个问题,表达式求值!其实表达式很多就是我们所谓的现实生活中的问题解 ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
- 二叉树的后序遍历(C语言)
首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子 ...
- 数据结构 5-3-2 二叉树前序中序后序遍历非递归实现
一.前言 上一篇整理了几种遍历方式的递归实现,递归的实现方法都很简单,区区几句代码就可以实现,但是如果要用非递归的方法来实现就有些挑战了. 二.中序遍历 从中序遍历开始,其实非递归的方法就是把递归变成 ...
- 层序遍历 和 基于栈实现的先\中\后序遍历
层序遍历 和 基于栈实现的先/中/后序遍历 1 层序遍历 level order traversal 2 基于栈实现的先/中/后序遍历 pre/in/post order traversal 1 层序 ...
- 数据结构34:二叉树前序遍历、中序遍历和后序遍历
链式存储结构存储的二叉树,对树中结点进行逐个遍历时,由于是非线性结构,需要找到一种合适的方式遍历树中的每个结点. 递归思想遍历二叉树 之前讲过,树是由根结点和子树部分构建的,对于每一棵树来说,都可以分 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
最新文章
- 向下钻取按钮位置设置
- 观看马云网商大会视频的一些感想.
- python爬虫基础(二)~工具包: 下载包requests、urllib和解析包BeautifulSoup(bs4)、lxml.etree.xpath
- 压缩机电流保护原因是什么?压缩机烧毁常见原因有哪些?
- 历届奥运会中国金牌数
- CompletableFuture API用法介绍(二)
- C++模板专门化与重载
- fanuc机器人码垛编程实例_FANUC 机器人码垛编程详细讲解 记得收藏!
- es统计mysql 报表_Elasticsearch(简称ES)实现日报表、月报表、年报表统计,没数据补0...
- css-font字体和文本样式
- git branch 分支管理
- MongoDB安装和批量写入
- String类基本介绍及常用方法
- PYNQ在PS端进行图片缩放
- C++大小写字母转换(齐全)
- 小技巧(1):Ububtu18.04中.z01 .z02 .z03此类拆分后压缩文件解压缩办法(以及常用解分卷压缩方法)
- 【Mskt问题的解决办法】使用御坂翻译器2.x版本遇到的常见问题及解决办法
- java hashmap hash算法,jdk1.8 中 HashMap 的 hash 算法和数组寻址
- contiki学习笔记之leds
- 三国论(6-10章)