二叉树前、中、后序遍历的迭代实现
前序
前序顺序为父左右
利用栈保证遍历的顺序,先将根节点入栈
while循环
将栈顶节点出栈输出,再依次把该节点的右节点和左节点(存在的话)入栈
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root==null) return res;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
root = stack.pop();
res.add(root.val);
if(root.right!=null) stack.push(root.right);
if(root.left!=null) stack.push(root.left);
}
return res;
}
中序
中序顺序为左父右
while循环
将从当前节点开始沿左子树方向的节点入栈,当当前节点没有左子树时当前节点出栈并输出,若当前节点有右子树则将右子树节点入栈
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
stack.push(root);
root=root.left;
}
root = stack.pop();
res.add(root.val);
root = root.right;
}
return res;
}
后序
后序的顺序为左右父
思路是加上一个指针来记录上一个遍历输出的节点,若当前的右子节点为空或是上次遍历的,则输出当前节点
public List<Integer> postorderTraversal(TreeNode root) {
TreeNode p = root,r = null;
List<Integer>ans = new ArrayList();
Deque<TreeNode>s = new ArrayDeque();
while(!s.isEmpty() || p != null)
{
if(p != null)
{
s.push(p);
p = p.left;
}
else
{
p = s.peek();
if(p.right == null || p.right == r)
{
ans.add(p.val);
r = p;
s.pop();
p = null;
}
else
p = p.right;
}
}
return ans;
}