借助栈来实现二叉树的先序后序遍历, 栈的特点是先进后出。
二叉树的先序遍历:
public class Num144_PreOrderNonRecursion {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if (root==null)
{
return ret;
}
Deque<TreeNode> stack=new ArrayDeque<>();
stack.push(root);
while (!stack.isEmpty())
{
TreeNode cur=stack.pop();
ret.add(cur.val);
if (cur.right!=null)
{
stack.add(cur.right);
}
if (cur.left!=null)
{
stack.add(cur.left);
}
}
return ret;
}
}
中序遍历:
public class Num94_InOrderNonRecursion {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root;
while (!stack.isEmpty()||cur!=null) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
//cur为空,走到了空结点,栈顶存放最左侧的结点
cur = stack.poll();
ret.add(cur.val);
cur = cur.right;
}
return ret;
}
}
后序遍历:
public class Num145_PostOrderNonRecursion {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ret=new ArrayList<>();
if (root==null)
{
return ret;
}
TreeNode cur=root;
//被处理过的结点
TreeNode prev=null;
Deque<TreeNode> stack=new ArrayDeque<>();
while (!stack.isEmpty()||cur!=null)
{
while (cur!=null)
{
stack.push(cur);
cur=cur.left;
}
//左树为空,cur为栈顶结点
cur=stack.pop();
if (cur.right==null||prev==cur.right)
{
ret.add(cur.val);
prev=cur;
cur=null;
}
else
//右数不为空,且没有被处理过
{
stack.push(cur);
cur=cur.right;
}
}
return ret;
}
}