二叉树的前序、中序、后序遍历(非递归版)
递归本质上就是栈的调用
1. 前序遍历
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<>(); if(root==null){ return list; } Stack<TreeNode> stack=new Stack<>(); stack.push(root); TreeNode temp=null; while(!stack.isEmpty()){ temp=stack.pop(); list.add(temp.val); if(temp.right!=null){ stack.push(temp.right); } if(temp.left!=null){ stack.push(temp.left); } } return list; }
2. 中序遍历
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res=new ArrayList<>(); if(root==null){ return res; } Stack<TreeNode> stack=new Stack<>(); TreeNode temp=root; while(true){ while(temp!=null){ stack.push(temp); temp=temp.left; } TreeNode cur=stack.pop(); res.add(cur.val); if(cur.right!=null){ temp=cur.right; }else{ temp=null; } if(temp==null && stack.isEmpty()){ break; } } return res; }
3. 后续遍历
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res=new ArrayList<>(); if(root==null){ return res; } Stack<TreeNode> stack=new Stack<>(); TreeNode temp=root; TreeNode prev=null; while(true){ while(temp!=null){ stack.push(temp); temp=temp.left; } temp=stack.pop(); if(temp.right!=null && temp.right!=prev){ stack.push(temp); temp=temp.right; }else{ res.add(temp.val); prev=temp; temp=null; } if(temp==null && stack.isEmpty()){ break; } } return res; }

浙公网安备 33010602011771号