三道leetcode上的题目:
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历
前序遍历
前序遍历:中左右
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/**
* @Author blackcat
* @version: 1.0
* @description:二叉树的前序遍历 中左右
* <p>
* 5
* 4 6
* 1 2 7 8
* <p>
* 结果:5 4 1 2 6 7 8
*/
public class Leetcode144 {
public static void main(String[] args) {
TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
TreeNode root = new TreeNode(5, left, right);
List<Integer> list = preorderTraversal(root);
System.out.println(Arrays.toString(list.toArray()));
List<Integer> list2 = preorderTraversal2(root);
System.out.println(Arrays.toString(list2.toArray()));
}
//迭代实现
public static List<Integer> preorderTraversal2(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return list;
}
//遍历实现
public static List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
preorder(root, list);
return list;
}
private static void preorder(TreeNode node, List<Integer> list) {
if (node == null) {
return;
}
list.add(node.val);
preorder(node.left, list);
preorder(node.right, list);
}
}
中序遍历
中序遍历:左中右
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/**
* @Author blackcat
* @version: 1.0
* @description:二叉树的中序遍历 <p>
* 5
* 4 6
* 1 2 7 8
* <p>
* 结果:1 4 2 5 7 6 8
*/
public class Leetcode94 {
public static void main(String[] args) {
TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
TreeNode root = new TreeNode(5, left, right);
List<Integer> list = inorderTraversal(root);
System.out.println(Arrays.toString(list.toArray()));
List<Integer> list2 = inorderTraversal2(root);
System.out.println(Arrays.toString(list2.toArray()));
}
//迭代实现
public static List<Integer> inorderTraversal2(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
}
return list;
}
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
inorder(root, list);
return list;
}
//中序遍历递归实现 左中右
private static void inorder(TreeNode node, List<Integer> list) {
if (node == null) {
return;
}
if (node.left != null) {
inorder(node.left, list);
}
list.add(node.val);
if (node.right != null) {
inorder(node.right, list);
}
}
}
后序遍历
中序遍历:左右中
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
/**
* @Author blackcat
* @version: 1.0
* @description:二叉树的后序遍历 <p>
* 5
* 4 6
* 1 2 7 8
* <p>
* 结果:1 2 4 7 8 6 5
*/
public class Leetcode145 {
public static void main(String[] args) {
TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
TreeNode root = new TreeNode(5, left, right);
List<Integer> list = postorderTraversal(root);
System.out.println(Arrays.toString(list.toArray()));
List<Integer> list2 = postorderTraversal2(root);
System.out.println(Arrays.toString(list2.toArray()));
}
//迭代实现
public static List<Integer> postorderTraversal2(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.peek();
if (node != null) {
stack.pop();// 将该节点弹出,避免重复操作,下面再将中右左节点添加到栈中
stack.push(node);
stack.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
} else {// 只有遇到空节点的时候,才将下一个节点放进结果集
//弹出空栈帧
stack.pop();
list.add(stack.pop().val);
}
}
return list;
}
//遍历实现
public static List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
postorder(root, list);
return list;
}
private static void postorder(TreeNode node, List<Integer> list) {
if (node == null) {
return;
}
postorder(node.left, list);
postorder(node.right, list);
list.add(node.val);
}
}