/*
* 后序遍历二叉树
* 核心思想是用栈做辅助空间,先从根节点往左一直入栈,直到为空,然后判断栈顶元素的右孩子,
* 如果为空或被访问过,说明此时栈顶为要访问的节点,出栈然后访问即可;
* 否则从它开始重复左孩子入栈的过程,接下来再判断栈顶元素的右孩子...直到栈空。
*/
public class BTPostorderTraversal
{
static class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val = x;
}
}
public static ArrayList<Integer> postorderTraversal(TreeNode root)
{
if(root == null)
{
return null;
}
ArrayList<Integer> _values = new ArrayList<Integer>();
Deque<TreeNode> _nodes = new ArrayDeque<TreeNode>();
TreeNode _pNode = root;
TreeNode _pre = null;//记录上一个访问的节点
while(_pNode != null || !_nodes.isEmpty())
{
while(_pNode != null)
{
_nodes.push(_pNode);
_pNode = _pNode.left;
}
_pNode = _nodes.peek();
//如果右节点为空或右节点被访问过,说明该节点就是要访问的节点
if(_pNode.right == null || _pNode.right == _pre)
{
_values.add(_nodes.pop().val);
_pre = _pNode;//记录被访问过的节点
_pNode = null;
}
else
{
_pNode = _pNode.right;
}
}
return _values;
}
}
* 后序遍历二叉树
* 核心思想是用栈做辅助空间,先从根节点往左一直入栈,直到为空,然后判断栈顶元素的右孩子,
* 如果为空或被访问过,说明此时栈顶为要访问的节点,出栈然后访问即可;
* 否则从它开始重复左孩子入栈的过程,接下来再判断栈顶元素的右孩子...直到栈空。
*/
public class BTPostorderTraversal
{
static class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x)
{
val = x;
}
}
public static ArrayList<Integer> postorderTraversal(TreeNode root)
{
if(root == null)
{
return null;
}
ArrayList<Integer> _values = new ArrayList<Integer>();
Deque<TreeNode> _nodes = new ArrayDeque<TreeNode>();
TreeNode _pNode = root;
TreeNode _pre = null;//记录上一个访问的节点
while(_pNode != null || !_nodes.isEmpty())
{
while(_pNode != null)
{
_nodes.push(_pNode);
_pNode = _pNode.left;
}
_pNode = _nodes.peek();
//如果右节点为空或右节点被访问过,说明该节点就是要访问的节点
if(_pNode.right == null || _pNode.right == _pre)
{
_values.add(_nodes.pop().val);
_pre = _pNode;//记录被访问过的节点
_pNode = null;
}
else
{
_pNode = _pNode.right;
}
}
return _values;
}
}