思想:
非递归遍历需要使用栈来作为存储树节点的容器,使用一个指针来作为判断,决定入栈还是出栈。
非递归遍历模板:
public List<Integer> preAndInOrderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode node;
while (root!=null||!stack.isEmpty()){
if (root!=null){
stack.push(root);
// ret.add(root.val); 先序
root=root.left;
}else {
node=stack.pop();
// ret.add(node.val);中序
root=node.right;
}
}
return ret;
}
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode node;
while (root!=null||!stack.isEmpty()){
if (root!=null){
stack.push(root);
ret.add(root.val);
root=root.right;
}else {
node=stack.pop();
root=node.left;
}
}
Collections.reverse(ret);
return ret;
}
灵感来源于使用栈的时候,无法保证出栈和入栈的时机。所以使用一个指针来配合使用。上述模板的意义在于根据指针是否为空,来决定入栈还是出栈。