概述
二叉树(Binary tree)是树形结构的一个重要类型。
许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树特点是每个节点最多只能有两棵子树,且有左右之分。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。
当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。
例子
前序遍历
思路
遍历顺序:根结点 -> 左子树 -> 右子树
代码示例
用递归的方式实现遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| package com.leetcode.editor.tree;
import com.leetcode.utils.TreeNode;
import java.util.ArrayList; import java.util.List;
public class BinaryTreePreorderTraversal {
public static void main(String[] args) { TreeNode left2 = new TreeNode(4); TreeNode right2 = new TreeNode(5); TreeNode left = new TreeNode(2, left2, right2); TreeNode right3 = new TreeNode(6); TreeNode right = new TreeNode(3, null, right3); TreeNode treeNode = new TreeNode(1, left, right); List<Integer> integers = preorderTraversal(treeNode); for (Integer integer : integers) { System.out.println(integer); } TreeNode.show(treeNode); }
public static List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); preorder(root, res); return res; }
public static void preorder(TreeNode root, List<Integer> res) { if (root == null) { return; } res.add(root.val); preorder(root.left, res); preorder(root.right, res); } }
|
输出
1 2 3 4 5 6 7 8 9 10 11
| 1 2 4 5 3 6 1 / \ 2 3 / \ \ 4 5 6
|
中序遍历
思路
遍历顺序:左子树 -> 根结点 -> 右子树
代码示例
用递归的方式实现遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| package com.leetcode.editor.tree;
import com.leetcode.utils.TreeNode;
import java.util.ArrayList; import java.util.List;
public class BinaryTreeInorderTraversal {
public static void main(String[] args) { TreeNode left2 = new TreeNode(4); TreeNode right2 = new TreeNode(5); TreeNode left = new TreeNode(2, left2, right2); TreeNode right3 = new TreeNode(6); TreeNode right = new TreeNode(3, null, right3); TreeNode treeNode = new TreeNode(1, left, right); List<Integer> integers = inorderTraversal(treeNode); for (Integer integer : integers) { System.out.println(integer); } TreeNode.show(treeNode); }
public static List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); inorder(root, res); return res; }
public static void inorder(TreeNode root, List<Integer> res) { if (root == null) { return; } inorder(root.left, res); res.add(root.val); inorder(root.right, res); } }
|
输出
1 2 3 4 5 6 7 8 9 10 11
| 4 2 5 1 3 6 1 / \ 2 3 / \ \ 4 5 6
|
后序遍历
思路
遍历顺序:左子树 -> 右子树 -> 根结点
代码示例
用递归的方式实现遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| package com.leetcode.editor.tree;
import com.leetcode.utils.TreeNode;
import java.util.ArrayList; import java.util.List;
public class BinaryTreePostorderTraversal {
public static void main(String[] args) { TreeNode left2 = new TreeNode(4); TreeNode right2 = new TreeNode(5); TreeNode left = new TreeNode(2, left2, right2); TreeNode right3 = new TreeNode(6); TreeNode right = new TreeNode(3, null, right3); TreeNode treeNode = new TreeNode(1, left, right); List<Integer> integers = postorderTraversal(treeNode); for (Integer integer : integers) { System.out.println(integer); } TreeNode.show(treeNode); }
public static List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); postorder(root, res); return res; }
public static void postorder(TreeNode root, List<Integer> res) { if (root == null) { return; } postorder(root.left, res); postorder(root.right, res); res.add(root.val); } }
|
输出
1 2 3 4 5 6 7 8 9 10 11
| 4 5 2 6 3 1 1 / \ 2 3 / \ \ 4 5 6
|
源码
查看此仓库