A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王震阳老师   /  2014-7-31 11:09  /  16951 人查看  /  238 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请多多指教。

DemoTree.rar

1.7 KB, 阅读权限: 100, 下载次数: 2

评分

参与人数 1技术分 +4 收起 理由
王震阳老师 + 4 赞一个!

查看全部评分

回复 使用道具 举报
先看看题目‘。。
回复 使用道具 举报
先来学习一下
回复 使用道具 举报
就业指导-王震阳老师 发表于 2014-8-2 23:41
自定义一个类,用该类来模拟一个二叉树结构,同时实现二叉树的遍历功能。 ...

请问遍历的时候是利用二叉树本身特点进行递归遍历(属内部遍历)?还是用二叉树的非递归遍历呢(属外部遍历)?我在在学校没学好,只了解内部遍历= =
回复 使用道具 举报
对这个有点不太熟悉,存在一个疑问!

二叉树.zip

2.34 KB, 阅读权限: 100, 下载次数: 1

评分

参与人数 1技术分 +4 收起 理由
王震阳老师 + 4 很给力!

查看全部评分

回复 使用道具 举报
基本实现了二叉树的功能,Junit测试也通过。有些算法可能写的不是很好,希望老师批评指正。谢谢。

BinaryTree.zip

7.25 KB, 阅读权限: 200, 下载次数: 1

二叉树java实现及测试

评分

参与人数 1技术分 +5 收起 理由
王震阳老师 + 5 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 justin1258 于 2014-8-3 17:55 编辑

做好喽~~
回复 使用道具 举报
终于弄完了。。急缺技术分

MyTree_4.zip

2.03 KB, 阅读权限: 200, 下载次数: 1

评分

参与人数 1技术分 +3 收起 理由
王震阳老师 + 3 赞一个!

查看全部评分

回复 使用道具 举报
刚没有设权限,重新传一下

BinaryTreeTest.rar

2.64 KB, 阅读权限: 200, 下载次数: 2

评分

参与人数 1技术分 +4 收起 理由
王震阳老师 + 4 赞一个!

查看全部评分

回复 使用道具 举报
cyc52tjm 发表于 2014-8-3 12:34
请问遍历的时候是利用二叉树本身特点进行递归遍历(属内部遍历)?还是用二叉树的非递归遍历呢(属外部遍 ...

内部遍历、外部遍历如果都会最好,但是至少得写一种。
回复 使用道具 举报
回帖领题!
回复 使用道具 举报
阳哥下午上传的题目你看了吗?过了今天是不是没有技术分领了?俺急需技术分{:3_65:}
回复 使用道具 举报
领题啊。。。
回复 使用道具 举报
网站有视频教程,为何没有相配套的练习呢?
回复 使用道具 举报
huangxuanheng 发表于 2014-8-2 23:16
对数据结构是理解了,但是如何使用Java语言来创建二叉树还不太懂,能不能给个提示? ...

数据结构我也接触过,在学校时,听老师好像讲过,感觉和介绍没有区别,现在都已经忘得差不多了!请问数据结构要怎么学呢?
回复 使用道具 举报
参考参考
回复 使用道具 举报
X11 发表于 2014-8-3 13:36
基本实现了二叉树的功能,Junit测试也通过。有些算法可能写的不是很好,希望老师批评指正。谢谢。 ...

答案很给力,请大家参考:
自定义二叉树类:
  1. package io;

  2. import java.util.LinkedList;
  3. import java.util.List;

  4. /**
  5. * 二叉树实现
  6. *
  7. * @author x11
  8. *
  9. * @param <E>
  10. *            实现了Comparable接口的对象。
  11. */
  12. public class BinaryTree<E extends Comparable<E>> {
  13.         private Node<E> root; // 根节点
  14.         private int size; // Tree的大小

  15.         /**
  16.          * 往二叉树中添加数据
  17.          *
  18.          * @param e
  19.          */
  20.         public void add(E e) {
  21.                 // e为null,抛出非法参数异常
  22.                 if (e == null) {
  23.                         throw new IllegalArgumentException("data can't be null!");
  24.                 }

  25.                 // 如果不存在根节点,创建根节点
  26.                 if (root == null) {
  27.                         root = new Node<E>(null, e);
  28.                         size++;
  29.                 } else {
  30.                         Node<E> current = root;
  31.                         Node<E> parent;

  32.                         while (true) {
  33.                                 parent = current;
  34.                                 if (e.compareTo(parent.getData()) == 0) {
  35.                                         // do nothing.
  36.                                         // 节点已经存在,不储存。
  37.                                         return;
  38.                                 }
  39.                                 // 节点的值比当前节点的值小,存储到当前节点的左子节点上。
  40.                                 else if (e.compareTo(parent.getData()) < 0) {
  41.                                         current = current.getLeftChild();
  42.                                         if (current == null) {
  43.                                                 Node<E> newNode = new Node<E>(parent, e);
  44.                                                 parent.setLeftChild(newNode);
  45.                                                 size++;
  46.                                                 return;
  47.                                         }
  48.                                 }
  49.                                 // 节点的值比当前节点的值大,存储到当前节点的右子节点上。
  50.                                 else {
  51.                                         current = current.getRightChild();
  52.                                         if (current == null) {
  53.                                                 Node<E> newNode = new Node<E>(parent, e);
  54.                                                 parent.setRightChild(newNode);
  55.                                                 size++;
  56.                                                 return;
  57.                                         }
  58.                                 }
  59.                         }
  60.                 }
  61.         }

  62.         public void add(E[] array) {
  63.                 for (E e : array ) {
  64.                         add(e);
  65.                 }
  66.         }
  67.         /**
  68.          * 清空二叉树
  69.          */
  70.         public void clear() {
  71.                 root = null;
  72.                 size = 0;
  73.         }

  74.         /**
  75.          * 二叉树中是否包含e元素
  76.          *
  77.          * @param e
  78.          * @return
  79.          */
  80.         public boolean contains(E e) {
  81.                 if (e == null || root == null) {
  82.                         return false;
  83.                 }
  84.                 Node<E> retNode = get(e);
  85.                 return !(retNode == null);
  86.         }
  87.         /**
  88.          * 删除节点node及以node为父节点的子二叉树
  89.          * @param node
  90.          */
  91.         public void remove(Node<E> node) {
  92.                 remove(node.getData());       
  93.         }
  94.         public void remove(E e) {
  95.                 Node<E> retNode = get(e);
  96.                 if (retNode == root) { //如果要删除的节点是根节点,则清空整个二叉树
  97.                         clear();
  98.                         return;
  99.                 }
  100.                 if (retNode != null) {
  101.                         if (e.compareTo(retNode.getParent().getData()) < 0 ) {
  102.                                 retNode.getParent().setLeftChild(null); // 该节点为父节点的左子节点,删除该左节点
  103.                         } else {
  104.                                 retNode.getParent().setRightChild(null);
  105.                         }
  106.                 }
  107.         }
  108.         /**
  109.          * 查找二叉树中是否存在某元素
  110.          *
  111.          * @param e
  112.          * @return 如果节点存在,返回该节点,否则返回null.
  113.          */
  114.         public Node<E> get(E e) {
  115.                 if (root == null)
  116.                         return null;

  117.                 Node<E> current = root;
  118.                 while (!e.equals(current.getData())) {
  119.                         if (e.compareTo(current.getData()) < 0) {
  120.                                 current = current.getLeftChild();
  121.                         } else {
  122.                                 current = current.getRightChild();
  123.                         }
  124.                         if (current == null) {
  125.                                 return null;
  126.                         }
  127.                 }
  128.                 return current;
  129.         }

  130.         /**
  131.          *
  132.          * @return 二叉树的大小
  133.          */
  134.         public int size() {
  135.                 return this.size;
  136.         }
  137.         /**
  138.          * 中序遍历(LDR: leftChild->root->rightChild)
  139.          * @return
  140.          */
  141.         public List<E> inOrder() {
  142.                 if (root == null)
  143.                         return null;
  144.                 List<E> list = new LinkedList<E>();
  145.                 inOrderTraverse(root.getLeftChild(),list);
  146.                 list.add(root.getData());
  147.                 inOrderTraverse(root.getRightChild(), list);
  148.                 return list;
  149.         }
  150.         private void inOrderTraverse(Node<E> child, List<E> list) {
  151.                 // TODO Auto-generated method stub
  152.                 if (child != null) {
  153.                         inOrderTraverse(child.getLeftChild(), list);
  154.                         list.add(child.getData());
  155.                         inOrderTraverse(child.getRightChild(), list);
  156.                 }
  157.         }
  158.         /**
  159.          * 前序遍历(DRL)
  160.          * @return
  161.          */
  162.         public List<E> preOrder() {
  163.                 if (root == null)
  164.                         return null;
  165.                 List<E> list = new LinkedList<E>();
  166.                 list.add(root.getData());
  167.                 preOrderTraverse(root.getRightChild(), list);
  168.                 preOrderTraverse(root.getLeftChild(),list);
  169.                 return list;
  170.         }
  171.         private void preOrderTraverse(Node<E> child, List<E> list) {
  172.                 // TODO Auto-generated method stub
  173.                 if (child != null) {
  174.                         list.add(child.getData());
  175.                         preOrderTraverse(child.getRightChild(), list);
  176.                         preOrderTraverse(child.getLeftChild(),list);
  177.                 }
  178.         }
  179.         /**
  180.          * 后序遍历(LRD)
  181.          * @return
  182.          */
  183.         public List<E> postOrder() {
  184.                 if (root == null)
  185.                         return null;
  186.                 List<E> list = new LinkedList<E>();
  187.                 postOrderTraverse(root.getLeftChild(),list);
  188.                 postOrderTraverse(root.getRightChild(), list);
  189.                 list.add(root.getData());
  190.                 return list;
  191.         }
  192.         private void postOrderTraverse(Node<E> child, List<E> list) {
  193.                 // TODO Auto-generated method stub
  194.                 if (child != null) {
  195.                         postOrderTraverse(child.getLeftChild(),list);
  196.                         postOrderTraverse(child.getRightChild(), list);
  197.                         list.add(child.getData());
  198.                 }
  199.         }
  200.         public String printTree() {
  201.                 if (inOrder() == null)
  202.                         return null;
  203.                 else
  204.                         return inOrder().toString();
  205.         }
  206. }

  207. /**
  208. * 二叉树节点
  209. *
  210. * @author x11
  211. *
  212. * @param <E>
  213. *            实现了Comparable接口的对象。
  214. */
  215. class Node<E> {
  216.         private Node<E> parent; // 父节点
  217.         private Node<E> leftChild; // 左子节点
  218.         private Node<E> rightChild; // 右子节点
  219.         private E data; // 节点内数据

  220.         public Node(Node<E> parent, E data) {
  221.                 super();
  222.                 this.parent = parent;
  223.                 this.data = data;
  224.         }

  225.         public Node<E> getParent() {
  226.                 return parent;
  227.         }

  228.         public void setParent(Node<E> parent) {
  229.                 this.parent = parent;
  230.         }

  231.         public Node<E> getLeftChild() {
  232.                 return leftChild;
  233.         }

  234.         public void setLeftChild(Node<E> leftChild) {
  235.                 this.leftChild = leftChild;
  236.         }

  237.         public Node<E> getRightChild() {
  238.                 return rightChild;
  239.         }

  240.         public void setRightChild(Node<E> rightChild) {
  241.                 this.rightChild = rightChild;
  242.         }

  243.         public E getData() {
  244.                 return data;
  245.         }

  246.         public void setData(E data) {
  247.                 this.data = data;
  248.         }

  249.         @Override
  250.         public String toString() {
  251.                 return "Node [data=" + data + "]";
  252.         }
  253.        
  254. }
复制代码

Test类:
  1. package io;

  2. import static org.junit.Assert.*;

  3. import org.junit.Before;
  4. import org.junit.Test;

  5. public class BinaryTreeTest {
  6.         BinaryTree<Integer> intBTree = null;
  7.         BinaryTree<String> strBTree = null;
  8.         Integer[] intArray;
  9.         String[] strArray;

  10.         @Before
  11.         public void before() {
  12.                 intBTree = new BinaryTree<Integer>();
  13.                 strBTree = new BinaryTree<String>();
  14.                 intArray = new Integer[] { 6, 2, 7, 11, 8, 9, 25 };
  15.                 strArray = new String[] { "h", "f", "b", "c", "d", "a" };

  16.                 intBTree.add(intArray);
  17.                 strBTree.add(strArray);
  18.         }

  19.         @Test
  20.         public void testAdd() {

  21.                 intBTree.add(2); // 元素相同,无法加入
  22.                 strBTree.add("a"); // 元素相同,无法加入
  23.                 System.out.println(intBTree.printTree());
  24.                 System.out.println(strBTree.printTree());
  25.         }

  26.         @Test
  27.         public void testClear() {
  28.                 // fail("Not yet implemented");
  29.                 intBTree.clear();
  30.                 strBTree.clear();
  31.                 System.out.println(intBTree.printTree());
  32.                 System.out.println(strBTree.printTree());
  33.         }

  34.         @Test
  35.         public void testContains() {
  36.                 System.out.println(intBTree.contains(6));
  37.                 System.out.println(intBTree.contains(1));
  38.                 System.out.println(strBTree.contains("a"));
  39.                 System.out.println(strBTree.contains("y"));
  40.         }

  41.         @Test
  42.         public void testRemoveNodeOfE() {
  43. //                fail("Not yet implemented");
  44.                 intBTree.remove(2);
  45.                 strBTree.remove("c");
  46.                 System.out.println(intBTree.printTree());
  47.                 System.out.println(strBTree.printTree());
  48.         }

  49.         @Test
  50.         public void testRemoveE() {
  51.                 fail("Not yet implemented");
  52.         }

  53.         @Test
  54.         public void testGet() {
  55. //                fail("Not yet implemented");
  56.                 Node<Integer> val1 = intBTree.get(1);
  57.                 Node<Integer> val2 = intBTree.get(6);
  58.                 Node<String> val3 = strBTree.get("a");
  59.                 Node<String> val4 = strBTree.get("z");
  60.                
  61.                 System.out.println(val1);
  62.                 System.out.println(val2);
  63.                 System.out.println(val3);
  64.                 System.out.println(val4);
  65.         }

  66.         @Test
  67.         public void testSize() {
  68. //                fail("Not yet implemented");
  69.                 System.out.println(intBTree.size());
  70.                 System.out.println(strBTree.size());
  71.         }

  72.         @Test
  73.         public void testInOrder() {
  74. //                fail("Not yet implemented");
  75.                 System.out.println(intBTree.inOrder().toString());
  76.                 System.out.println(strBTree.inOrder().toString());
  77.         }

  78.         @Test
  79.         public void testPreOrder() {
  80. //                fail("Not yet implemented");
  81.                 System.out.println(intBTree.preOrder().toString());
  82.                 System.out.println(strBTree.preOrder().toString());
  83.         }

  84.         @Test
  85.         public void testPostOrder() {
  86. //                fail("Not yet implemented");
  87.                 System.out.println(intBTree.postOrder().toString());
  88.                 System.out.println(strBTree.postOrder().toString());
  89.         }

  90.         @Test
  91.         public void testPrintTree() {
  92.                 fail("Not yet implemented");
  93.         }

  94. }
复制代码
回复 使用道具 举报
就看看吧,自己做做试试
回复 使用道具 举报
本帖最后由 yqj 于 2014-8-4 22:27 编辑

刚写完测试中,没想到结果已经公布了,学习中
回复 使用道具 举报

挺好:
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.Stack;

  5. /**
  6. * ①用Java代码模拟实现一个二叉树结构②创建该二叉树③遍历该二叉树。
  7. *
  8. * @author Administrator TODO
  9. */
  10. class DemoTree {
  11.         public static void main(String[] args) throws IOException {
  12.                 int value;
  13.                 // 创建树对象
  14.                 Tree theTree = new Tree();
  15.                 // 添加元素
  16.                 theTree.insert(50);
  17.                 theTree.insert(75);
  18.                 theTree.insert(12);
  19.                 theTree.insert(37);
  20.                 theTree.insert(43);
  21.                 theTree.insert(30);
  22.                 theTree.insert(33);
  23.                 theTree.insert(87);
  24.                 theTree.insert(93);
  25.                 theTree.insert(97);
  26.                 theTree.insert(50);
  27.                 while (true) {
  28.                         System.out.println("a.查看树结构。");
  29.                         System.out.println("b.遍历树。");
  30.                         System.out.println("请输入a,b");
  31.                         int choice = getChar();
  32.                         switch (choice) {
  33.                         // 查看树结构
  34.                         case 'a':
  35.                                 theTree.displayTree();
  36.                                 break;
  37.                         case 'b':
  38.                                 System.out.println("1.前序遍历:");
  39.                                 System.out.println("2,中序遍历");
  40.                                 System.out.println("3.后序遍历");
  41.                                 System.out.println("请选择1,2,3");
  42.                                 value = getInt();
  43.                                 theTree.traverse(value);
  44.                                 break;
  45.                         default:
  46.                                 System.out.println("格式不正確\n");
  47.                         }
  48.                 }
  49.         }

  50.         public static char getChar() throws IOException {
  51.                 String s = getString();
  52.                 return s.charAt(0);
  53.         }

  54.         public static String getString() throws IOException {
  55.                 InputStreamReader isr = new InputStreamReader(System.in);
  56.                 BufferedReader br = new BufferedReader(isr);
  57.                 String s = br.readLine();
  58.                 return s;
  59.         }

  60.         public static int getInt() throws IOException {
  61.                 String s = getString();
  62.                 return Integer.parseInt(s);
  63.         }

  64. }
  65. //二叉树中每个节点对象
  66. class Node {
  67.         //节点的数据
  68.         public int iData;
  69.         //节点左孩子
  70.         public Node leftChild;
  71.         //节点的右孩子
  72.         public Node rightChild;
  73.         public void displayNode(){
  74.         }
  75. }
  76. //二叉树的结构对象
  77. class Tree {
  78.         //叉树的根节点
  79.         private Node root;
  80.         public Tree(){
  81.                 root = null;
  82.         }
  83.         /**
  84.          * 添加元素
  85.          * @param id 节点的值
  86.          */
  87.         public void insert(int id){
  88.                 //创建新节点
  89.                 Node newNode = new Node();
  90.                 newNode.iData = id;
  91.                 //如果树是空的,就将新节点作为根
  92.                 if(root == null){
  93.                         root = newNode;
  94.                 }
  95.                 //否则,作为根的孩子
  96.                 else{
  97.                         Node current = root;
  98.                         Node parent;
  99.                         while(true){
  100.                                 parent = current;
  101.                                 //如果节点的值小于父节点的值并父节点没有左孩子,它就作为父节点左孩子
  102.                                 if(id < current.iData){
  103.                                         current = current.leftChild;
  104.                                         if(current ==null){
  105.                                                 parent.leftChild = newNode;
  106.                                                 return;
  107.                                                
  108.                                         }
  109.                                 }
  110.                                 //如果节点的值大于父节点的值并父节点没有右孩子,它就作为父节点右孩子
  111.                                 if(id > current.iData){
  112.                                         current = current.rightChild;
  113.                                         if(current == null){
  114.                                                 parent.rightChild = newNode;
  115.                                                 return;
  116.                                         }
  117.                                 }
  118.                                 //否则节点值等于父节点的值,直接返回
  119.                                 else{
  120.                                         return;
  121.                                 }
  122.                         }
  123.                 }
  124.         }
  125.         /**
  126.          * (内部)遍历树
  127.          * @param traverseType 输入的数字
  128.          */
  129.         public void traverse(int traverseType){
  130.                
  131.                 switch(traverseType){
  132.                
  133.                 case 1:
  134.                         System.out.println("\n前序遍历:");
  135.                         preOrder(root);
  136.                         break;
  137.                 case 2:
  138.                         System.out.println("\n中序遍历:");
  139.                         inOrder(root);
  140.                         break;
  141.                 case 3:
  142.                         System.out.println("\n后序遍历:");
  143.                         postOrder(root);
  144.                         break;
  145.                         default:
  146.                                 System.out.println("输入不正确");
  147.                 }
  148.                 System.out.println();
  149.         }
  150.         //前序遍历
  151.         private void preOrder(Node localRoot){
  152.                 if(localRoot!=null){
  153.                         System.out.print(localRoot.iData+" ");
  154.                         preOrder(localRoot.leftChild);
  155.                         preOrder(localRoot.rightChild);
  156.                        
  157.                 }
  158.         }
  159.         //中序遍历
  160.         private void inOrder(Node localRoot){
  161.                 if(localRoot!=null){
  162.                         inOrder(localRoot.leftChild);
  163.                         System.out.print(localRoot.iData+" ");
  164.                         inOrder(localRoot.rightChild);
  165.                        
  166.                 }
  167.         }
  168.         //后序遍历
  169.         private void postOrder(Node localRoot){
  170.                 if(localRoot!=null){
  171.                         postOrder(localRoot.leftChild);
  172.                         postOrder(localRoot.rightChild);
  173.                         System.out.print(localRoot.iData+" ");
  174.                        
  175.                 }
  176.         }
  177.         /**
  178.          * 展示树结构的排列方式
  179.          */
  180.         public void displayTree(){
  181.                 //创建一个栈
  182.                 Stack globalStack = new Stack();
  183.                 //现将树压栈
  184.                 globalStack.push(root);
  185.                 //树中的节点数减1
  186.                 int nBlanks = 32;
  187.                 boolean isRowEmpty =false;
  188.                 System.out.println("-------------------------------------------");
  189.                 while(isRowEmpty == false){
  190.                         Stack localStack = new Stack();
  191.                         isRowEmpty = true;
  192.                         for(int j=0;j<nBlanks;j++){
  193.                                 System.out.print(" ");
  194.                                
  195.                         }
  196.                         while(globalStack.isEmpty() == false){
  197.                                 Node temp = (Node)globalStack.pop();
  198.                                 if(temp!=null){
  199.                                         System.out.print(temp.iData);
  200.                                         localStack.push(temp.leftChild);
  201.                                         localStack.push(temp.rightChild);
  202.                                         if(temp.leftChild !=null||temp.rightChild !=null)
  203.                                                 isRowEmpty = false;
  204.                                 }
  205.                                 else{
  206.                                         System.out.print("--");
  207.                                         localStack.push(null);
  208.                                         localStack.push(null);
  209.                                        
  210.                                 }
  211.                                 for(int j=0;j<nBlanks*2-2;j++)
  212.                                         System.out.print(" ");
  213.                         }
  214.                         System.out.println();
  215.                         System.out.println();
  216.                         nBlanks /= 2;
  217.                         while(localStack.isEmpty()==false)
  218.                                 globalStack.push(localStack.pop());
  219.                 }
  220.                 System.out.println("-------------------------------------");
  221.         }
  222. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马