一、先序遍历
顺序为:根节点、左节点、右节点。使用栈来完成递归过程,注意先放右子节点,再放左子节点。
public List<Integer> preOrder(TreeNode root){ List<Integer> ans = new ArrayList<>(); if(root == null) return ans; Deque<TreeNode> s = new LinkedList<>(); TreeNode p = root; s.addLast(p); while(!s.isEmpty()){ p = s.pollLast(); ans.add(p.val); if(p.right != null){ s.addLast(p.right); } if(p.left != null){ s.addLast(p.left); } } return ans; }
二、中序遍历
顺序为:左节点、根节点、右节点。使用栈完成递归过程,栈空表示当前左分支已至末尾,可以弹出并判断youfenzhi
public List<Integer> inOrder(TreeNode root){ List<Integer> ans = new ArrayList<>(); if(root == null) return ans; Deque<TreeNode> s = new LinkedList<>(); TreeNode p = root; while(p != null || !s.isEmpty()){ while(p != null){ s.addLast(p); p = p.left; } if(!s.isEmpty()){ p = s.pollLast(); ans.add(p.val); p = p.right; } } return ans; }
三、后序遍历
顺序为:左节点、根节点、右节点。使用q记录p的右子树是否遍历结束。
public List<Integer> postOrder(TreeNode root){ List<Integer> ans = new ArrayList<>(); if(root == null) return ans; Deque<TreeNode> s = new LinkedList<>(); TreeNode p = root, q = root; while(p != null || !s.isEmpty()){ while(p != null){ s.addLast(p); p = p.left; } p = s.peekLast(); if(p.right == null || q = p.right){ ans.add(p.val); s.pollLast(); q = p; p = null; }else{ p = p.right; } } return ans; }