后序遍历的实现 使用非递归算法:
1.后序遍历的顺序是左右根。
2.使用栈来输出到数组中即是根右左
3.在入栈时,应当先放根,再放右节点,当节点无右节点或栈内上一个元素为右节点时,输出左节点到数组中。
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
//返回答案的数组
ArrayList<Integer> arrayList = new ArrayList<Integer>();
//初始条件检查
if (root == null) {
return arrayList;
}
//存储节点的链表栈
Deque<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode prev = null;
//栈内有元素或root指针非空时执行
while (!stack.isEmpty() || root!= null){
//root指针抵达树的后序遍历第一个叶子左节点位置。
while (root != null){
stack.push(root);
root = root.left;
}
//root指向栈内弹出的节点
root = stack.pop();
//当节点无右节点或栈内上一个元素为右节点时,输出左节点到数组中,并移动调节指针位置
if (root.right == null || root.right == prev) {
arrayList.add(root.val);
prev = root;
root = null;
}else{
//否则压入右节点,并调节root指针位置
stack.push(root);
root = root.right;
}
}
return arrayList;
}
}