当前位置:   article > 正文

[数据结构]二叉树(JAVA)_java 二叉树

java 二叉树

一:二叉树的概念

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 或者是由一个根节点加上两棵别称为左子树右子树的二叉树组成。

1. 二叉树不存在度大于2的结点

2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

二: 两种特殊的二叉树

1. 满二叉树:

一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵
二叉树的层数为K,且结点总数是2^k-1,则它就是满二叉树。

2. 完全二叉树:

 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0n-1的结点一一对应时称之为完 全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

三:二叉树重要的性质

1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 (i>0)个结点
2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)
3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0n21
4. 具有n个结点的完全二叉树的深度k 上取整
5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号
则对于序号为i 的结点有:
i>0双亲序号:(i-1)/2i=0i为根结点编号,无双亲结点
2i+1<n,左孩子序号:2i+1,否则无左孩子
2i+2<n,右孩子序号:2i+2,否则无右孩子

四:二叉树的简单代码模拟实现

  1. public class BinaryTree {
  2. //孩子结点表示法
  3. static class TreeNode {
  4. int value;
  5. TreeNode left;
  6. TreeNode right;
  7. public TreeNode(int value) {
  8. this.value = value;
  9. }
  10. }
  11. public TreeNode root;
  12. public void createTree() {
  13. TreeNode node1 = new TreeNode(1);
  14. TreeNode node2 = new TreeNode(2);
  15. TreeNode node3 = new TreeNode(3);
  16. TreeNode node4 = new TreeNode(4);
  17. TreeNode node5 = new TreeNode(5);
  18. TreeNode node6 = new TreeNode(6);
  19. TreeNode node7 = new TreeNode(7);
  20. TreeNode node8 = new TreeNode(8);
  21. node1.left = node2;
  22. node1.right = node3;
  23. node2.left = node4;
  24. node2.right = node5;
  25. node5.right = node8;
  26. node3.left = node6;
  27. node3.right = node7;
  28. root = node1;
  29. }
  30. public TreeNode createTree(LinkedList<Integer> list){
  31. //含参的创建方法
  32. TreeNode root=null;
  33. if(list==null||list.isEmpty()){
  34. return null;
  35. }
  36. Integer value=list.removeFirst();
  37. if(value!=null){
  38. root=new TreeNode(value);
  39. root.left=createTree(list);
  40. root.right=createTree(list);
  41. }
  42. return root;
  43. }
  44. //前序遍历
  45. public void preOrder(TreeNode root) {
  46. if (root == null) {
  47. return;
  48. }
  49. System.out.print(root.value + " ");
  50. preOrder(root.left);
  51. preOrder(root.right);
  52. }
  53. //中序遍历
  54. public void midOrder(TreeNode root) {
  55. if (root == null) {
  56. return;
  57. }
  58. midOrder(root.left);
  59. System.out.print(root.value + " ");
  60. midOrder(root.right);
  61. }
  62. //后序遍历
  63. public void postOrder(TreeNode root) {
  64. if (root == null) {
  65. return;
  66. }
  67. postOrder(root.left);
  68. postOrder(root.right);
  69. System.out.print(root.value + " ");
  70. }
  71. //层序遍历
  72. void levelOrder(TreeNode root) {
  73. Queue<TreeNode> queue = new LinkedList<>();
  74. if (root != null) {
  75. queue.offer(root);
  76. }
  77. while (!queue.isEmpty()) {
  78. root = queue.peek();
  79. if (root.left != null) {
  80. queue.offer(queue.peek().left);
  81. }
  82. if (root.right != null) {
  83. queue.offer(queue.peek().right);
  84. }
  85. System.out.print(queue.poll().value + " ");
  86. }
  87. System.out.println();
  88. }
  89. // 获取树中节点的个数
  90. int size(TreeNode root) {
  91. if (root == null) {
  92. return 0;
  93. }
  94. return 1 + size1(root.left) + size1(root.right);
  95. }
  96. // 获取叶子节点的个数
  97. int getLeafNodeCount1(TreeNode root) {
  98. if (root == null) {
  99. return 0;
  100. }
  101. if (root.left == null && root.right == null) {
  102. return 1;
  103. }
  104. return getLeafNodeCount1(root.left) + getLeafNodeCount1(root.right);
  105. }
  106. // 获取第K层节点的个数
  107. int getKLevelNodeCount(TreeNode root, int k) {
  108. if (root == null || k == 0) {
  109. return 0;
  110. }
  111. if (k == 1) {
  112. return 1;
  113. }
  114. return getKLevelNodeCount(root.left, k - 1) + getKLevelNodeCount(root.right, k - 1);
  115. }
  116. // 获取二叉树的高度
  117. int getHeight(TreeNode root) {
  118. if (root == null) {
  119. return 0;
  120. }
  121. if (root.left == null && root.right == null) {
  122. return 1;
  123. }
  124. int leftHeight = getHeight(root.left);
  125. int rightHeight = getHeight(root.right);
  126. return Math.max(leftHeight, rightHeight) + 1;
  127. }
  128. // 检测值为value的元素是否存在
  129. TreeNode find(TreeNode root, int val) {
  130. if (root == null) {
  131. return null;
  132. }
  133. if (root.value == val) {
  134. return root;
  135. }
  136. TreeNode rootLeft = find(root.left, val);
  137. TreeNode rootRight = find(root.right, val);
  138. if (rootLeft != null) {
  139. return rootLeft;
  140. }
  141. if (rootRight != null) {
  142. return rootRight;
  143. }
  144. return null;
  145. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/783408
推荐阅读
相关标签
  

闽ICP备14008679号