树的概念

tree@2x (2).png

二叉树的物理存储结构

二叉树可以使用以下两种物理结构表达:

  • 链式存储结构
  • 数组

使用链式存储结构表述二叉树

Task And BackStack.png

使用数组表述二叉树

image.png

二叉树的特殊形式

二叉树在实际应用时有许多特殊形式,主要时为了方便进行查找操作和维持相对顺序这两个操作。

查找

二叉查找树
**
又名:二叉搜索树、二叉排序树。具有以下几个条件:

  • 如果左子树不为空,则左子树上所有节点的值均小于根节点的值
  • 如果右子树不为空,则右子树上所有节点的值均大于根节点的值
  • 左、右子树也都是二叉查找树

    维持相对顺序

    涉及知识点:二叉树的自平衡。
    二叉树的自平衡的方式有许多种,如红黑树、AVL树以及树堆等。

    二叉树的遍历

    以下图二叉树的遍历为例:
    tempo.png

    深度优先遍历

    前序遍历

    遍历顺序:根节点 -> 左子树 -> 右子树

    输出:1 -> 2 -> 4 -> 5 -> 3 -> 6

中序遍历

遍历顺序:左子树 -> 根节点 -> 右子树

输出:4 -> 2 -> 5 -> 1 -> 3 -> 6

后序遍历

遍历顺序:左子树 -> 右子树 -> 根节点

输出:4 -> 5 -> 2 -> 6 -> 3 -> 1

代码表示(递归实现)

  1. /**
  2. * 构建二叉树
  3. *
  4. * @param inputList 输入序列,链表的顺序恰好为二叉树前序遍历的顺序
  5. * @return 构建好的二叉树
  6. */
  7. public static TreeNode createBinaryTree(LinkedList<Integer> inputList){
  8. TreeNode node = null;
  9. if (inputList == null || inputList.isEmpty()){
  10. return null;
  11. }
  12. Integer data = inputList.removeFirst();
  13. if (data != null){
  14. node = new TreeNode(data);
  15. node.left = createBinaryTree(inputList);
  16. node.right = createBinaryTree(inputList);
  17. }
  18. return node;
  19. }
  20. /**
  21. * 前序遍历:根节点 -> 左子树 -> 右子树
  22. * tip:递归实现
  23. * @param node
  24. */
  25. public static void preOrderTraveral(TreeNode node){
  26. if (node == null){
  27. return;
  28. }
  29. System.out.println(node.val);
  30. preOrderTraveral(node.left);
  31. preOrderTraveral(node.right);
  32. }
  33. /**
  34. * 中序遍历:左子树 -> 根节点 -> 右子树
  35. * tip:递归实现
  36. * @param node
  37. */
  38. public static void inOrderTraveral(TreeNode node){
  39. if (node == null){
  40. return;
  41. }
  42. inOrderTraveral(node.left);
  43. System.out.println(node.val);
  44. inOrderTraveral(node.right);
  45. }
  46. /**
  47. * 后序遍历:左子树 -> 右子树 -> 根节点
  48. * tip:递归实现
  49. * @param node
  50. */
  51. public static void postOrderTraveral(TreeNode node){
  52. if (node == null){
  53. return;
  54. }
  55. postOrderTraveral(node.left);
  56. postOrderTraveral(node.right);
  57. System.out.println(node.val);
  58. }
  59. /**
  60. * 二叉树节点类
  61. */
  62. public static class TreeNode {
  63. int val;
  64. TreeNode left;
  65. TreeNode right;
  66. TreeNode(int x) {
  67. val = x;
  68. }
  69. }

除递归实现二叉树的前序遍历、中序遍历、后序遍历外,还可使用 来完成这一过程。

广度优先遍历

层序遍历

输出:1 -> 2 -> 3 -> 4 -> 5 -> 6