定义
二叉树: 二叉树由根元素,以及左子树和右子树构成,当然它也可以是一颗空树。
满二叉树: 除最后一层外,每一层的节点都有两个子节点。
二叉树的遍历
中序遍历
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
访问顺序: 左子树 > 根 > 右子树
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList();
inorder(root, result);
return result;
}
public void inorder(TreeNode root, List<Integer> result) {
if (root == null) return;
inorder(root.left, result); // 遍历左边
result.add(root.val); // 加上根节点
inorder(root.right, result); // 遍历右边
}
}
前序遍历
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
访问顺序: 根 > 左子树 > 右子树
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList();
preorder(root, result);
return result;
}
public void preorder(TreeNode root, List<Integer> result) {
if (root == null) return;
result.add(root.val); // 加上根节点
preorder(root.left, result); // 遍历左边
preorder(root.right, result); // 遍历右边
}
}
后序遍历
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
访问顺序: 左子树 > 右子树 > 根
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList();
postorder(root, result);
return result;
}
public void postorder(TreeNode root, List<Integer> result) {
if (root == null) return;
postorder(root.left, result);
postorder(root.right, result);
result.add(root.val);
}
}
N叉树的前序、后序遍历
https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
class Solution {
public List<Integer> preorder(Node root) {
List<Integer> result = new ArrayList();
preorder(root, result);
return result;
}
public void preorder(Node root, List<Integer> result) {
if (root == null) return;
result.add(root.val); // 加上根节点
for (Node node : root.children)
preorder(node, result);
}
}
https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
class Solution {
public List<Integer> postorder(Node root) {
List<Integer> result = new ArrayList();
postorder(root, result);
return result;
}
public void postorder(Node root, List<Integer> result) {
if (root == null) return;
for (Node node : root.children)
postorder(node, result);
result.add(root.val);
}
}
层序遍历
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList();
levelOrder(root, result, 0);
return result;
}
public void levelOrder(TreeNode root, List<List<Integer>> result, int level) {
if (root == null) return;
while (result.size() <= level) {
List<Integer> item = new ArrayList();
result.add(item);
}
result.get(level).add(root.val);
levelOrder(root.left, result, level + 1);
levelOrder(root.right, result, level + 1);
}
}
递归效率太低了,或许我们可以用栈
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
List<Integer> item = new ArrayList();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
item.add(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
result.add(item);
}
return result;
}
}