一、什么是二叉树?

image.png

二、二叉树的遍历方法

先序遍历:根—>左—>右
中序遍历:左—>根—>右
后序遍历:左—>右—>根

先根后左逆
例:
二叉树学习笔记 - 图2
image.png
代码实现先序遍历:

  1. /**
  2. * 先序遍历
  3. * @param rootTreeNode 根节点
  4. */
  5. public static void preTraverseBTree(TreeNode rootTreeNode) {
  6. //如果中序或后序遍历只需要改变下面代码的顺序就好了
  7. if (rootTreeNode != null) {
  8. //访问根节点
  9. System.out.println(rootTreeNode.getValue());
  10. //访问左节点
  11. preTraverseBTree(rootTreeNode.getLefTreeNode());
  12. //访问右节点
  13. preTraverseBTree(rootTreeNode.getRightNode());
  14. }
  15. }

注意:
通过先序和中序或者中序和后序我们可以还原出原始的二叉树,但是通过先序和后续是无法还原出原始的二叉树的,即必须知道中序遍历的结果才能还原二叉树;

三、二叉查找树

定义:当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大
优点:明眼人可以看出,这对我们来找一个数是非常方便快捷的
往往我们动态创建二叉树都是创建二叉查找树
二叉树学习笔记 - 图4
动态创建二叉树代码实现:
TreeRoot.java表示根节点

  1. public class TreeRoot {
  2. private TreeNode treeRoot;
  3. public TreeNode getTreeRoot() {
  4. return treeRoot;
  5. }
  6. public void setTreeRoot(TreeNode treeRoot) {
  7. this.treeRoot = treeRoot;
  8. }
  9. }

比较与根谁大,大的往右边,小的往左边:

  1. /**
  2. * 动态创建二叉查找树
  3. *
  4. * @param treeRoot 根节点
  5. * @param value 节点的值
  6. */
  7. public static void createTree(TreeRoot treeRoot, int value) {
  8. //如果树根为空(第一次访问),将第一个值作为根节点
  9. if (treeRoot.getTreeRoot() == null) {
  10. TreeNode treeNode = new TreeNode(value);
  11. treeRoot.setTreeRoot(treeNode);
  12. } else {
  13. //当前树根
  14. TreeNode tempRoot = treeRoot.getTreeRoot();
  15. while (tempRoot != null) {
  16. //当前值大于根值,往右边走
  17. if (value > tempRoot.getValue()) {
  18. //右边没有树根,那就直接插入
  19. if (tempRoot.getRightNode() == null) {
  20. tempRoot.setRightNode(new TreeNode(value));
  21. return ;
  22. } else {
  23. //如果右边有树根,到右边的树根去
  24. tempRoot = tempRoot.getRightNode();
  25. }
  26. } else {
  27. //左没有树根,那就直接插入
  28. if (tempRoot.getLefTreeNode() == null) {
  29. tempRoot.setLefTreeNode(new TreeNode(value));
  30. return;
  31. } else {
  32. //如果左有树根,到左边的树根去
  33. tempRoot = tempRoot.getLefTreeNode();
  34. }
  35. }
  36. }
  37. }
  38. }

测试代码:

  1. int[] arrays = {2, 3, 1, 4, 5};
  2. //动态创建树
  3. TreeRoot root = new TreeRoot();
  4. for (int value : arrays) {
  5. createTree(root, value);
  6. }
  7. //先序遍历树
  8. preTraverseBTree(root.getTreeRoot());
  9. System.out.println("---------------");
  10. //中序遍历树
  11. inTraverseBTree(root.getTreeRoot());
  12. System.out.println("---------------");

测试结果:
image.png


本文参考于:https://juejin.im/post/6844903582202855438#heading-5