题目
题目:非递归后根遍历(后序遍历)二叉树,树结构如下:
遍历结果:20 40 30 80 120 100 50
猜想
非递归先根遍历和中根遍历都使用栈是可以的,后根也可以吧?
简化
1.这棵树太复杂了,简单一点更容易理解.于是
打印结果:30 100 50
打印这样的结果,需要50进栈,100进栈,30进栈。那就是父节点进栈,看栈顶元素是否有孩子,如果有,右孩子进栈,左孩子进栈,最后无元素可进了,再弹栈呗
好简单,运行一下代码,有问题。
第二次栈顶元素50时,再次把100和30压栈了,进入了死循环。
我们看一下,怎么把50从栈里弹出。
观察一下,如果上一个弹出的元素,是栈顶的孩子,那么栈顶元素的孩子节点就不要进栈了
落实一下代码逻辑
把二叉树的根节点,压栈
查看栈顶元素是否有孩子,如果有:右孩子进栈,左孩子进栈;如果没有,弹栈
增加一个复杂的例子
看一下操作
这种方法,成功。上代码,Python版本
""" 50 / \ 30 100 / \ / \ 20 40 80 120 """ class Solution(object): def postOrderNoRecursion(self, root): if not root: return stack = list() stack.append(root) top = TreeNode(None) lastPop = TreeNode(None) while stack: # 看栈顶 top = stack[len(stack) - 1] # 如果栈顶有子节点,就进栈;但是刚弹出元素就是栈顶元素的子节点,就不要重复进栈了。 if (top.left or top.right) and lastPop is not top.right and lastPop is not top.left: if top.right: stack.append(top.right) if top.left: stack.append(top.left) else: lastPop = stack.pop() print(lastPop.val)
Java 版本
public void postOrderNoRecursion(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); stack.add(root); TreeNode top = null; TreeNode lastPop = null; while (!stack.isEmpty()) { top = stack.peek(); if ((top.left != null || top.right != null) && lastPop != top.right && lastPop != top.left) { if (top.right != null) { stack.add(top.right); } if (top.left != null) { stack.add(top.left); } } else { lastPop = stack.pop(); System.out.println(lastPop.val); } } }
关注源代码清单,技术人的学习清单
相关推荐
西门子SCL编程语言是SIMATIC编程系统中的一种高级文本编程语言,主要应用于S7-1500和S7-300/400系列PLC。"SCL"代表Structured Control Language,是一种基于IEC 61131-3标准的编程语言,类似于传统的高级语言如C或...
1. **SCL基础知识**:介绍SCL的语法结构、基本元素和编程规则,包括变量声明、赋值操作、条件语句(IF...THEN...ELSE)、循环语句(WHILE, FOR)、函数调用等。 2. **数据类型和变量管理**:详述各种内置数据类型和...
压缩包含centos-release-scl-rh-2-3.el7.centos.noarch.rpm和centos-release-scl-2-3.el7.centos.noarch.rpm,主要用于centos7的gcc安装
官方离线安装包,亲测可用
离线安装包,亲测可用
例如,你可以定义一个包含多个元素的数组,如 ARRAY[1..10] OF REAL: myArray; 这创建了一个包含10个浮点数的数组。 在SCL中,函数块(FB)和组织块(OB)是程序的主要结构。OB用于定义周期性或事件驱动的程序段,...
离线安装包,亲测可用
1. **安装**:手册介绍了如何安装S7-SCL软件,确保用户能够顺利地在MS Windows 2000 Professional或XP Professional操作系统上设置编程环境。 2. **设计S7-SCL计划**:这部分详细讲解了如何创建S7-SCL程序,包括...
官方离线安装包,亲测可用
SIMATIC_S7-SCL_V5.6安装包-链接地址
官方离线安装包,亲测可用
标题"S7-SCL V5.6.rar"表明这是一个关于西门子S7-SCL编程语言的软件资源,版本为V5.6,并且是适用于Windows 10专业版的中文版。描述中提到的"step7v5.6 sp1 chinese"确认了这与西门子的Step 7编程软件有关,版本号为...
S7-SCL 提供了高级语言结构,因此它适合用于计算和数据管理算法。
scl3300-d01,datasheet,数据描述表,高性能3轴倾角传感器 在倾斜测定方面具有超高性能 尺寸: 7.6×8.6×3.3mm (宽×长×高) 针对用途以及要求值可从4种模式中选择测定模式 超低噪声、高分辨率 0.001°/√Hz SPI...
离线安装包,亲测可用
SCL编程语言包SIMATIC_S7SCL_V56/s7-300-400
在西门子PLC的SCL编程中,S7-1200和S7-1500型号是两种广泛使用的可编程逻辑控制器。SCL(Structured Control Language)是一种高级编程语言,用于编写和处理西门子PLC的控制逻辑。SCL指令手册提供了针对S7-1200和S7-...
症状自评量表SCL90(打印版) 症状自评量表SCL90是心理学领域中的一种常用评估工具,旨在评估个体的心理症状及其严重程度。该评估工具共有90个项目,涵盖了情感、思维、行为、生活习惯、人际关系、饮食、睡眠等多...
SIMATIC S7-SCL V5.1是一款适用于S7-300/S7-400系列PLC的高级编程软件,它支持在STEP 7环境中使用结构化控制语言(Structured Control Language,SCL)进行程序设计。SCL是一种高级编程语言,类似于Pascal或C语言,...