画二叉树 java实现

来源:互联网 发布:故宫淘宝h5 编辑:程序博客网 时间:2024/05/01 19:06
最近无聊,写了一个画二叉树的程序。
[java]view plaincopyprint?
  1. import java.awt.Color;  
  2. import java.awt.Graphics2D;  
  3. import java.awt.image.BufferedImage;  
  4. import java.io.File;  
  5. import java.io.IOException;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import java.util.PriorityQueue;  
  9. import java.util.Queue;  
  10. import java.util.Stack;  
  11. import javax.imageio.ImageIO;  
  12. publicclass TreeDrawer {  
  13. int totalLevel = 0;  
  14. int leftpadding = Integer.MAX_VALUE;  
  15. publicvoid printTree(TreeNode root, String name) throws IOException{  
  16.         totalLevel = getTotalLevel(root) - 1;  
  17.         BufferedImage bi = new BufferedImage(1366768, BufferedImage.TYPE_INT_BGR);  
  18.         Graphics2D g = bi.createGraphics();  
  19.         g.setBackground(Color.cyan);  
  20.         g.setColor(Color.blue);  
  21.         ArrayList q = new ArrayList();  
  22.         q.add(root);  
  23.         BFSAndPaint(g, q, 0false);  
  24.         bi = new BufferedImage(1366768, BufferedImage.TYPE_INT_BGR);  
  25.         g = bi.createGraphics();  
  26.         BFSAndPaint(g, q, 0true);  
  27.         ImageIO.write(bi, "png"new File(name + ".png"));  
  28. this.leftpadding = Integer.MAX_VALUE;  
  29.     }  
  30. publicvoid BFSAndPaint(Graphics2D g, ArrayList l, int level, boolean repaint){  
  31.         ArrayList buff = new ArrayList();  
  32. for(int i = 0; i < lsizeispan>
  33.             TreeNode current = l.get(i);  
  34.             GraphicNode gnode = null;  
  35. if(null != current){  
  36.                 gnode = new GraphicNode(level, i, totalLevel);  
  37. int gnodeX = gnode.getPoint(repaint).x;  
  38. int gnodeY = gnode.getPoint(repaint).y;  
  39.                 g.drawString(current.node + "", gnodeX, gnodeY);  
  40. if(gnodeX < leftpaddingrepaintspan>
  41.                     leftpadding = gnodeX;  
  42.                 }  
  43. if(null != current.left){  
  44. int leftIndex = i * 2;  
  45.                     GraphicNode gnode_left = new GraphicNode(level + 1, leftIndex, totalLevel);  
  46.                     g.drawLine(gnodeX + 5, gnodeY, gnode_left.getPoint(repaint).x + 5, gnode_left.getPoint(repaint).y - 10);  
  47.                 }  
  48.                 buff.add(current.left);  
  49. if(null != current.right){  
  50. int rightIndex = i * 2 + 1;  
  51.                     GraphicNode gnode_right = new GraphicNode(level + 1, rightIndex, totalLevel);  
  52.                     g.drawLine(gnodeX + 5, gnodeY, gnode_right.getPoint(repaint).x + 5, gnode_right.getPoint(repaint).y - 10);  
  53.                 }  
  54.                 buff.add(current.right);  
  55.             }else{  
  56.                 buff.add(null);  
  57.                 buff.add(null);  
  58.             }  
  59.         }  
  60. if(isBuffEmpty(buff)){  
  61. return;  
  62.         }else{  
  63.             BFSAndPaint(g, buff, level + 1, repaint);  
  64.         }  
  65.     }  
  66. publicstaticvoid main(String args []) throws IOException{  
  67.         TreeDrawer drawer = new TreeDrawer();  
  68.         drawer.run();  
  69.     }  
  70. privatevoid run() throws IOException{  
  71.         TreeNode node = new TreeNode((int)(Math.random() * 100));  
  72. this.createBT(node, 0);  
  73. this.printTree(node, "test");  
  74.     }  
  75. privatevoid createBT(TreeNode node, int n){  
  76. if(n < 5){  
  77. return;  
  78.         }  
  79. boolean hasLeft = Math.random() < 0.2 ? true : false;  
  80. if(hasLeft){  
  81.             node.left = new TreeNode((int)(Math.random() * 100));  
  82.             createBT(node.left, n + 1);  
  83.         }  
  84. boolean hasRight = Math.random() < 0.1 ? true : false;  
  85. if(hasRight){  
  86.             node.right = new TreeNode((int)(Math.random() * 100));  
  87.             createBT(node.right, n + 1);  
  88.         }  
  89.     }  
  90. privateboolean isBuffEmpty(List list){  
  91. boolean ret = true;  
  92. for(TreeNode node : list){  
  93. if(null != node)  
  94.                 ret = false;  
  95.         }  
  96. return ret;  
  97.     }  
  98. privateint getTotalLevel(TreeNode node){  
  99. if(null == node){  
  100. return0;  
  101.         }  
  102. return Math.max(getTotalLevel(node.left), getTotalLevel(node.right)) + 1;  
  103.     }  
  104. privateclass GraphicNode{  
  105. private Point p;  
  106. privateint level;  
  107. privateint index;  
  108. publicstaticfinalint LOWEST_PADDING = 20;// padding of lowest level. first level is 0
  109. publicstaticfinalint LEVEL_PADDING = 30;//padding between levels
  110. privateint totalLevel;  
  111. public GraphicNode(int level, int index, int totalLevel){ //total level is equal to lowest level
  112. this.level = level;  
  113. this.index = index;  
  114. this.totalLevel = totalLevel;  
  115. this.p = computeP(this.level, this.index);  
  116.         }  
  117. private Point computeP(int level, int index) {  
  118. int x = 0;  
  119. for(int i = this.totalLevel; i <level; i--){  
  120.                 x += getLevelPadding(i) / 2;  
  121.             }  
  122.             x += getLevelPadding(level) * index;  
  123. int y = LEVEL_PADDING * (level + 1);  
  124. returnnew Point(x, y);  
  125.         }  
  126. public Point getPoint(boolean repaint){  
  127. if(repaint){  
  128. returnnew Point(p.x - leftpadding, p.y);  
  129.             }  
  130. return p;  
  131.         }  
  132. privateint getLevelPadding(int level){  
  133. return (int) (LOWEST_PADDING * Math.pow(2this.totalLevel - level));  
  134.         }  
  135.     }  
  136. privateclass Point{  
  137. int x;  
  138. int y;  
  139. public Point(int x, int y){  
  140. this.x = x;  
  141. this.y = y;  
  142.         }  
  143. publicint getX(){  
  144. returnthis.x;  
  145.         }  
  146. publicint getY(){  
  147. returnthis.y;  
  148.         }  
  149.     }  
  150. privateclass TreeNode{  
  151. int node;  
  152.         TreeNode left;  
  153.         TreeNode right;  
  154. public TreeNode(int n){  
  155.             node = n;  
  156.             left = null;  
  157.             right = null;  
  158.         }  
  159.     }  
  160. }  
0 0
原创粉丝点击