java 二叉树的后序遍历(非递归)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 二叉树的后序遍历(非递归)相关的知识,希望对你有一定的参考价值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/* 伪代码:
1. 栈初始化
2. 循环直到root为空且栈为空
2.1 当root非空时循环
2.1.1 将root连同标志flag=1入栈
2.1.2 继续遍历root的左子树
2.2 当栈非空 且 栈顶元素flag=2时循环
2.2.1 栈顶元素弹出至root
2.2.2 输出root.val
2.2.3 root置为空
2.3 如果栈非空,则
2.2.1 栈顶元素的标志flag改为2
2.2.2 准备遍历栈顶结点的右子树
*/
class BiTreePostOrder {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
Deque<Integer> flag = new ArrayDeque<>();
while(root!=null || stack.size()!=0) {
while(root!=null) {
stack.addFirst(root);
flag.addFirst(1);
root = root.left;
}
while(stack.size()!=0 && flag.peekFirst()==2) {
root = stack.removeFirst();
flag.removeFirst();
result.add(root.val);
root = null; //重要!否则程序陷入死循环,永远跳不出外层while循环
}
if(stack.size()!=0) {
flag.removeFirst();
flag.addFirst(2);
root = stack.peekFirst().right;
}
}
return result;
}
}
以上是关于java 二叉树的后序遍历(非递归)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
二叉树的后序遍历(非递归方法)
二叉树的后序遍历(简单)
C语言数据结构,急求在线二叉树先序中序后序递归遍历
LintCode 68. 二叉树的后序遍历
leetcode145——二叉树的后序遍历序列(非递归解法)