二叉树
示意图
遍历序列
- 先序遍历序列:[4、2、1、3、6、5、7]
- 中序遍历序列:[1、2、3、4、5、6、7]
- 后续遍历序列:[1、3、2、5、7、6、4]
遍历方案
二叉树节点
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
先序遍历(深度优先)
public static void preorder(TreeNode root, List<TreeNode> result) {
if (root == null) {
return;
}
result.add(root);
preorder(root.left, result);
preorder(root.right, result);
}
public void preorder(TreeNode root, List<TreeNode> result) {
TreeNode cur = root;
Stack<TreeNode> stack = new Stack<>();
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
result.add(cur);
stack.push(cur);
cur = cur.left;
}
else {
cur = stack.pop();
cur = cur.right;
}
}
}
中序遍历
public static void inorder(TreeNode root, List<TreeNode> result) {
if (root == null) {
return;
}
inorder(root.left, result);
result.add(root);
inorder(root.right, result);
}
public static void inorder(TreeNode root, List<TreeNode> result) {
TreeNode cur = root;
Stack<TreeNode> stack = new Stack<>();
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
}
else {
cur = stack.pop();
result.add(cur);
cur = cur.right;
}
}
}
后续遍历
public static void postorder(TreeNode root, List<TreeNode> result) {
if (root == null) {
return;
}
postorder(root.left, result);
postorder(root.right, result);
result.add(root);
}
public static void postorder(TreeNode root, List<TreeNode> result) {
TreeNode cur = root, last = null;
Stack<TreeNode> stack = new Stack<>();
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
}
else {
cur = stack.peek();
if (cur.right == null || cur.right == last) {
result.add(cur);
stack.pop();
last = cur;
cur = null;
}
else {
cur = cur.right;
}
}
}
}
层次遍历(广度优先遍历)
public List<TreeNode> levelOrder(TreeNode root) {
List<TreeNode> list = new LinkedList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
list.add(node);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return list;
}