二叉树相关操作(Java实现)

àì夳堔傛蜴生んèń 2022-05-28 03:58 223阅读 0赞
  1. package myTest;
  2. import java.util.ArrayList;
  3. //二叉树的节点类,你可以将它写成内部类的形式
  4. class BTreeNode {
  5. int data;
  6. BTreeNode Left;
  7. BTreeNode Right;
  8. public BTreeNode(int data) {
  9. this.data=data;
  10. this.Left=null;
  11. this.Right=null;
  12. }
  13. public BTreeNode(int data,BTreeNode Left,BTreeNode Right) {
  14. this.data=data;
  15. this.Left=Left;
  16. this.Right=Right;
  17. }
  18. public BTreeNode getLeft() {
  19. return Left;
  20. }
  21. public void setLeft(BTreeNode Left) {
  22. this.Left = Left;
  23. }
  24. public BTreeNode getRight() {
  25. return Right;
  26. }
  27. public void setRight(BTreeNode Right) {
  28. this.Right = Right;
  29. }
  30. public int getData() {
  31. return data;
  32. }
  33. public void setData(int data) {
  34. this.data = data;
  35. }
  36. }
  37. //二叉树的创建
  38. //(1)* 创建树
  39. //*
  40. //* 以完全二叉树的格式来创建(子树不存在的用-1填充),
  41. //* 对完全二叉树中每一个节点从0开始进行编号,
  42. //* 那么第i个节点的左孩子的编号为2*i+1,右孩子为2*i+2。
  43. public class BTreeFactory{
  44. /*完全二叉树格式+for循环建立二叉树
  45. *for循环创建。基本思路是先针对输入数组产生相同大小的节点对象数组,存储这些节点对象的引用变量和对应的数据存储到一个数组中。
  46. *之后用for循环再进行Left和Right的保存
  47. */
  48. public static BTreeNode CreateTree1(int[]a,int k){
  49. ArrayList<BTreeNode>aList=new ArrayList<BTreeNode>();
  50. if(a.length==0) return null;
  51. for(int i=0;i<a.length;i++)
  52. { //-1表示该位置处节点为空
  53. if(a[i]!=-1){aList.add(new BTreeNode(a[i]));}
  54. else {aList.add(null);}
  55. }
  56. //针对前N/2的节点的Left和Right进行赋值
  57. for(int i=0;i<aList.size()/2;i++){
  58. if(aList.get(i)!=null){
  59. aList.get(i).Left=aList.get(2*i+1);
  60. if((2*i+2)<aList.size())
  61. {aList.get(i).Right=aList.get(2*i+2);}
  62. }
  63. }
  64. return aList.get(0);
  65. }
  66. /*完全二叉树的输入格式+递归法
  67. */
  68. public static BTreeNode CreateTree2(int[]a,int k){
  69. if(a.length==0) return null;//如果数组长度为0,则不创建节点
  70. if(k>(a.length-1)) return null;//遍历完了数组中所有的值
  71. if(a[k]==-1) return null;//如果当前值为-1,则不建立节点
  72. BTreeNode root=new BTreeNode(a[k]);//创建当前节点
  73. root.Left=CreateTree2(a, 2*k+1);
  74. root.Right=CreateTree2(a,2*k+2);
  75. return root;
  76. }
  77. /*根据先序遍历和中序遍历创建二叉树
  78. */
  79. public static int[] GetPartArray(int[]a,int start,int end){
  80. if(end<start) return null;
  81. int[]aa=new int[end-start+1];
  82. for(int i=start;i<=end;i++){
  83. aa[i-start]=a[i];
  84. }
  85. return aa;
  86. }
  87. public static int GetPosition(int[]a,int target){
  88. int pos=-1;
  89. for(int i=0;i<a.length;i++){
  90. if(a[i]==target) {pos=i;break;}
  91. }
  92. return pos;
  93. }
  94. /*根据先序遍历和中序遍历创建二叉树
  95. */
  96. public static BTreeNode CreateTree3(int[]a,int[]b){
  97. if(a==null) return null;
  98. BTreeNode root=new BTreeNode(a[0]);
  99. if(a.length==1)
  100. {root.Left=null;
  101. root.Right=null;}
  102. else{int Posroot=GetPosition(b,a[0]);
  103. root.Left=CreateTree3(GetPartArray(a, 1, Posroot),GetPartArray(b, 0, Posroot-1));
  104. root.Right=CreateTree3(GetPartArray(a, Posroot+1, a.length-1),GetPartArray(b, Posroot+1, a.length-1));
  105. }
  106. return root;
  107. }
  108. /*根据中序遍历和后序遍历建立二叉树
  109. *
  110. */
  111. public static BTreeNode CreateTree4(int[]b,int[]c){
  112. if(c==null) return null;
  113. BTreeNode root=new BTreeNode(c[c.length-1]);
  114. if(c.length==1)
  115. {root.Left=null;
  116. root.Right=null;}
  117. else{int Posroot=GetPosition(b,c[c.length-1]);
  118. root.Left=CreateTree4(GetPartArray(b, 0, Posroot-1),GetPartArray(c, 0, Posroot-1));
  119. root.Right=CreateTree4(GetPartArray(b, Posroot+1, b.length-1),GetPartArray(c, Posroot, c.length-2));
  120. }
  121. return root;
  122. }
  123. /*先序遍历输出一个二叉树
  124. *
  125. */
  126. public static void PrePrintBTree(BTreeNode root){
  127. if(root==null)
  128. {return;}
  129. else
  130. {System.out.println(root.data);
  131. PrePrintBTree(root.Left);
  132. PrePrintBTree(root.Right);
  133. }
  134. }
  135. /*中序遍历输出一个二叉树
  136. *
  137. */
  138. public static void MidPrintBTree(BTreeNode root){
  139. if(root==null)
  140. {return;}
  141. else
  142. {MidPrintBTree(root.Left);
  143. System.out.println(root.data);
  144. MidPrintBTree(root.Right);
  145. }
  146. }
  147. /*后序遍历输出一个二叉树
  148. *
  149. */
  150. public static void LastPrintBTree(BTreeNode root){
  151. if(root==null)
  152. {return;}
  153. else
  154. {LastPrintBTree(root.Left);
  155. LastPrintBTree(root.Right);
  156. System.out.println(root.data);
  157. }
  158. }
  159. public static void main(String[]args){
  160. //完全二叉树层序遍历格式的输入
  161. int[]arr={89,73,82,-1,-1,92,5,-1,-1,-1,-1,69};
  162. //完全二叉树格式的输入+递归法创建
  163. BTreeNode root=CreateTree2(arr,0);
  164. //先序遍历
  165. System.out.println("先序遍历:");
  166. PrePrintBTree(root);
  167. //中序遍历
  168. System.out.println("中序遍历:");
  169. MidPrintBTree(root);
  170. //后序遍历
  171. System.out.println("后序遍历:");
  172. LastPrintBTree(root);
  173. //完全二叉树格式先序遍历的输入+for循环创建
  174. BTreeNode root2=CreateTree1(arr,0);
  175. //先序遍历
  176. System.out.println("先序遍历:");
  177. PrePrintBTree(root2);
  178. //中序遍历
  179. System.out.println("中序遍历:");
  180. MidPrintBTree(root2);
  181. //后序遍历
  182. System.out.println("后序遍历:");
  183. LastPrintBTree(root2);
  184. //以先序加中序的数组来创建一个二叉树
  185. int[]a={5,2,1,4,3,6,8,7,9,11,10};//先序遍历结果
  186. int[]b={1,2,3,4,5,6,7,8,9,10,11};//中序遍历结果
  187. int[]c={1,3,4,2,7,10,11,9,8,6,5};//后序遍历结果
  188. BTreeNode root3=CreateTree3(a, b);
  189. //先序遍历
  190. System.out.println("先序遍历:");
  191. PrePrintBTree(root3);
  192. //中序遍历
  193. System.out.println("中序遍历:");
  194. MidPrintBTree(root3);
  195. //后序遍历
  196. System.out.println("后序遍历:");
  197. LastPrintBTree(root3);
  198. BTreeNode root4=CreateTree4(b, c);
  199. //先序遍历
  200. System.out.println("先序遍历:");
  201. PrePrintBTree(root4);
  202. //中序遍历
  203. System.out.println("中序遍历:");
  204. MidPrintBTree(root4);
  205. //后序遍历
  206. System.out.println("后序遍历:");
  207. LastPrintBTree(root4);
  208. }
  209. }

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java操作

    下面聊聊二叉树的使用,二叉树的基本理论想必大家都很明白了,直接上代码, 1、首先是一个节点Node,这个节点有下面几个属性,数据项,以及对左右子节点的引用, pub

    相关 iOS 相关算法实现

    什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树。二叉树的子树有左右之分,并且次