二叉树 中序、前序、后序遍历 ,递归实现及非递归实现(Java)
遍历递归实现
中序遍历
public static List<Integer> inorderTraversal(TreeNode root){
List<Integer> nodes = new LinkedList<>();
dfs(root, nodes);
return nodes;
}
private static void dfs(TreeNode root, List<Integer> nodes) {
if(root != null){
dfs(root.left, nodes);
nodes.add(root.val);
dfs(root.right, nodes);
}
}
前序遍历
只用将dfs中nodes.add(root.val)移至dfs(root.left, nodes)前
后遍历
只用将dfs中nodes.add(root.val)移至dfs(root.right, nodes)后
非递归实现
中序遍历
public static List<Integer> inorderTraversal(TreeNode root){
List<Integer> nodes = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
nodes.add(cur.val);
cur = cur.right;
}
return nodes;
}
先序遍历
public static List<Integer> preOrderTraversal(TreeNode root){
List<Integer> nodes = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
while(cur != null){
nodes.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return nodes;
}
后续遍历
public static List<Integer> postOrderTraversal(TreeNode root){
List<Integer> nodes = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root, prev = null;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();
if(cur.right != null && cur.right != prev){
cur = cur.right;
}else{
stack.pop();
nodes.add(cur.val);
prev = cur;
cur = null;
}
}
return nodes;
}

浙公网安备 33010602011771号