二叉树oj ——>后序遍历(非递归)
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树oj ——>后序遍历(非递归)相关的知识,希望对你有一定的参考价值。
题目要求:
解题思路:
后序遍历相对来说比较麻烦一些,但是基本思路没有变
- 从根节点的左子树开始,保存每一个不为空的结点
- 当左子树为空时,获取栈顶元素(不是取出!!!),有可能这个结点的右子树不为空,因此判断右子树若不为空,让这个结点继续进行循环
- 如果为空,就遍历这个结点,并将其出栈,
- 当我们将上一步执行之后,发现,这个循环又回到了刚刚获取过了的这个结点,如此循环,就形成了死循环
- 我们的原因是因为无法得知这个结点的值有没有打印,那么就给他添加一个标记,给上一个已经遍历了的结点加上标记,并且,多加一个判断即可
解题代码:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
//如果是空树,直接返回
if(root == null){
return list;
}
Stack<TreeNode> s = new Stack<>();
TreeNode cur = root;
TreeNode prev = null;
while(!s.empty() || cur != null){
while(cur != null){
s.push(cur);
cur = cur.left;
}
TreeNode top = s.peek();
if(top.right == null || top.right == prev){
prev = top;
list.add(top.val);
s.pop();
}else{
cur = top.right;
}
}
return list;
}
}
以上是关于二叉树oj ——>后序遍历(非递归)的主要内容,如果未能解决你的问题,请参考以下文章