• java链树(含树的详细代码)


    目录

    一:树的介绍

    二:二叉树的概念

    三:二叉树的特点

    3.1 二叉树的度

    3.2 满二叉树

    3.3 完全二叉树

    四:树的存储结构

    五:二叉树的应用案例

    5.1 二叉排序树

    5.2 二叉树遍历​

    5.3 平衡二叉树

    ​六:链树(非顺序树)的案例实现

    6.1 创建树的结点

    6.2:树的操作(争对root)

    6.3:树的测试


    一:树的介绍

    大的数组插入和删除的话需要进行大规模的数据移动

    大的链表检索最后一个也需要进行大量的程序运行

    所以:

    二:二叉树的概念

    结点的权:结点的值

    结点的路径:从根找到目标结点的路线

    树的高度:最大层数

    森林:多棵子树 

    三:二叉树的特点

    3.1 二叉树的度

    3.2 满二叉树

    叶子结点都在最后一层,并且叶子结点的个数 = 2^(层数-1)

    3.3 完全二叉树

    叶子节点在倒数第一层或者倒数第二层,倒数第一层的叶子结点左边连续,倒数第二层的叶子结点右边连续

    四:树的存储结构

    满二叉树存储到数组中不浪费空间

    非满二叉树适合采用链表进行存储

    五:二叉树的应用案例

    5.1 二叉排序树5.2 二叉树遍历5.3 平衡二叉树

    将平衡因子改变的结点拿出来

    六:链树(非顺序树)的案例实现

    6.1 创建树的结点

    1. package tree;
    2. public class Node {
    3. private int id;
    4. private String name;
    5. private Node left;
    6. private Node right;
    7. public Node(int id, String name) {
    8. this.id = id;
    9. this.name = name;
    10. }
    11. public int getId() {
    12. return id;
    13. }
    14. public void setId(int id) {
    15. this.id = id;
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public Node getLeft() {
    24. return left;
    25. }
    26. public void setLeft(Node left) {
    27. this.left = left;
    28. }
    29. public Node getRight() {
    30. return right;
    31. }
    32. public void setRight(Node right) {
    33. this.right = right;
    34. }
    35. @Override
    36. public String toString() {
    37. return "Node [id=" + id + ", name=" + name + ", left=" + left + ", right=" + right + "]";
    38. }
    39. //前序
    40. public void preSelect() {
    41. System.out.println(this);
    42. if(this.getLeft() != null) {
    43. this.getLeft().preSelect();
    44. }
    45. if(this.getRight() != null) {
    46. this.getRight().preSelect();
    47. }
    48. }
    49. //中序遍历
    50. public void indexSelect() {
    51. if(this.getLeft() != null) {
    52. this.getLeft().indexSelect();
    53. }
    54. System.out.println(this);
    55. if(this.getRight() != null) {
    56. this.getLeft().indexSelect();
    57. }
    58. }
    59. //后续遍历
    60. public void postSelect() {
    61. if(this.getLeft() != null) {
    62. this.getLeft().postSelect();
    63. }
    64. if(this.getRight() != null) {
    65. this.getLeft().postSelect();
    66. }
    67. System.out.println(this);
    68. }
    69. //前序遍历查找
    70. public Node preSearch(int no) {
    71. if(this.getId() == no) {
    72. return this;
    73. }
    74. Node node = null;
    75. if(this.getLeft() != null) {
    76. node = this.getLeft().preSearch(no);
    77. }
    78. if(node != null) {
    79. return node;
    80. }
    81. if(this.getRight() != null) {
    82. node = this.getRight().preSearch(no);
    83. }
    84. return node;
    85. }
    86. //中序遍历查找
    87. public Node indexSearch(int no) {
    88. Node node = null;
    89. if(this.getLeft() != null) {
    90. node = this.getLeft().indexSearch(no);
    91. }
    92. if(node != null) {
    93. return node;
    94. }
    95. if(this.getId() == no) {
    96. return this;
    97. }
    98. if(this.getRight() != null) {
    99. node = this.getRight().indexSearch(no);
    100. }
    101. return node;
    102. }
    103. //后序遍历查找
    104. public Node postSearch(int no) {
    105. Node node = null;
    106. if(this.getLeft() != null) {
    107. node = this.getLeft().postSearch(no);
    108. }
    109. if(node != null) {
    110. return node;
    111. }
    112. if(this.getRight() != null) {
    113. node = this.getRight().postSearch(no);
    114. }
    115. if(node != null) {
    116. return node;
    117. }
    118. if(this.getId() == no) {
    119. return this;
    120. }
    121. return node;
    122. }
    123. public void delNode(int no) {
    124. if(this.getLeft() != null && this.getLeft().id == no) {
    125. this.left = null;
    126. return;
    127. }
    128. if(this.getRight() != null && this.getRight().id == no) {
    129. this.right = null;
    130. return;
    131. }
    132. if(this.left != null) {
    133. this.getLeft().delNode(no);
    134. }
    135. if(this.right != null) {
    136. this.getRight().delNode(no);
    137. }
    138. }
    139. }

    6.2:树的操作(争对root)

    此处删除只是类似文件删除操作,没有详细分解

    1. package tree;
    2. public class TreeNode {
    3. private Node root;
    4. public void setRoot(Node head) {
    5. this.root = head;
    6. }
    7. public void preSelect() {
    8. if(root == null) {
    9. System.out.println("该树为空,无法遍历...");
    10. return;
    11. }else {
    12. this.root.preSelect();
    13. }
    14. }
    15. public void indexSelect() {
    16. if(root == null) {
    17. System.out.println("该树为空,无法遍历...");
    18. return;
    19. }else {
    20. this.root.indexSelect();
    21. }
    22. }
    23. public void postSelect() {
    24. if(root == null) {
    25. System.out.println("该树为空,无法遍历...");
    26. return;
    27. }else {
    28. this.root.postSelect();
    29. }
    30. }
    31. public Node preSearch(int no) {
    32. if(root == null) {
    33. System.out.println("该树为空,无法遍历...");
    34. return null;
    35. }else {
    36. return root.preSearch(no);
    37. }
    38. }
    39. public Node indexSearch(int no) {
    40. if(root == null) {
    41. System.out.println("该树为空,无法遍历...");
    42. return null;
    43. }else {
    44. return root.indexSearch(no);
    45. }
    46. }
    47. public Node postSearch(int no) {
    48. if(root == null) {
    49. System.out.println("该树为空,无法遍历...");
    50. return null;
    51. }else {
    52. return root.postSearch(no);
    53. }
    54. }
    55. public void delNode(int no) {
    56. if(root == null) {
    57. System.out.println("该树为空,无法遍历...");
    58. }else {
    59. if(root.getId() == no) {
    60. root = null;
    61. }else {
    62. root.delNode(no);
    63. }
    64. }
    65. }
    66. }

    6.3:树的测试

    1. package tree;
    2. public class Test {
    3. public static void main(String[] args) {
    4. // TODO Auto-generated method stub
    5. TreeNode tree = new TreeNode();
    6. Node n1 = new Node(1,"孙尚香");
    7. Node n2 = new Node(2,"吕布");
    8. Node n3 = new Node(3,"貂蝉");
    9. Node n4 = new Node(4,"关羽");
    10. Node n5 = new Node(5,"张飞");
    11. Node n6 = new Node(6,"刘备");
    12. tree.setRoot(n1);
    13. n1.setLeft(n2);
    14. n1.setRight(n3);
    15. n2.setLeft(n4);
    16. n2.setRight(n5);
    17. n3.setLeft(n6);
    18. tree.preSelect();
    19. Node node = tree.preSearch(6);
    20. if(node != null) {
    21. System.out.printf("查到该结点:id = " + node.getId() + ", name = " + node.getName() + "\n");
    22. }else {
    23. System.out.printf("未查到该节点\n");
    24. }
    25. tree.delNode(6);
    26. tree.preSelect();
    27. }
    28. }

  • 相关阅读:
    git1:git课程概述
    《21天精通TypeScript-5》类型注解与原始类型
    5.64 BCC工具之llcstat.py解读
    Spring Boot 2.x源码系列【4】启动流程深入解析之启动监听器
    webapck打包原理--启动过程分析
    数据库(一):MySQL
    极限多标签分类-评价指标
    3-7数据链路层-设备
    dllexport和dllimport
    演讲笔记|《一个ppt者的成长故事》
  • 原文地址:https://blog.csdn.net/qq_56127002/article/details/126449388