二叉树的遍历_软件天地_百度空间
  1. package tree.bintree;   
  2.   
  3. /**
  4. * 创建 非xx二叉树、xx二叉树、满二叉树
  5. *
  6. * 由于二叉树的节点增加没有什么规则,所以这里只是简单的使用了递一
  7. * 次性把整棵树创建出来,而没有设计出一个一个添加节点的方法与删除
  8. *
  9. * @author jzj
  10. * @date 2009-12-23
  11. */  
  12. public class BinTree {// Bin=Binary(二进位的, 二元的)   
  13.   
  14.     protected Entry root;//根   
  15.     private int size;//树的节点数   
  16.   
  17.     /**
  18.       * 树的节点结构
  19.       * @author jzj
  20.       * @date 2009-12-23
  21.       */  
  22.     protected static class Entry {   
  23.         int elem;//数据域,这里我们作为编号   
  24.          Entry left;//左子树   
  25.          Entry right;//右子树   
  26.   
  27.         public Entry(int elem) {   
  28.             this.elem = elem;   
  29.          }   
  30.   
  31.         public String toString() {   
  32.             return " number=" + elem;   
  33.          }   
  34.      }   
  35.   
  36.     /**
  37.       * 根据给定的节点数创建一个xx二叉树或是满二叉树
  38.       * @param nodeCount 要创建节点总数
  39.       */  
  40.     public void createFullBiTree(int nodeCount) {   
  41.          root = recurCreateFullBiTree(1, nodeCount);   
  42.      }   
  43.   
  44.     /**
  45.       * 递归创建xx二叉树
  46.       * @param num 节点编号
  47.       * @param nodeCount 节点总数
  48.       * @return TreeNode 返回创建的节点
  49.       */  
  50.     private Entry recurCreateFullBiTree(int num, int nodeCount) {   
  51.          size++;   
  52.          Entry rootNode = new Entry(num);//根节点   
  53.         //如果有左子树则创建左子树   
  54.         if (num * 2 <= nodeCount) {   
  55.              rootNode.left = recurCreateFullBiTree(num * 2, nodeCount);   
  56.             //如果还可以创建右子树,则创建   
  57.             if (num * 2 + 1 <= nodeCount) {   
  58.                  rootNode.right = recurCreateFullBiTree(num * 2 + 1, nodeCount);   
  59.              }   
  60.          }   
  61.         return (Entry) rootNode;   
  62.      }   
  63.   
  64.     /**
  65.       * 根据给定的数组创建一棵树,这个棵树可以是xx二叉树也可是普通二叉树
  66.       * 数组中为0的表示不创建该位置上的节点
  67.       * @param nums 数组中指定了要创建的节点的编号,如果为0,表示不创建
  68.       */  
  69.     public void createBinTree(int[] nums) {   
  70.          root = recurCreateBinTree(nums, 0);   
  71.      }   
  72.   
  73.     /**
  74.       * 递归创建二叉树
  75.       * @param nums 数组中指定了要创建的节点的编号,如果为0,表示不创建
  76.       * @param index 需要使用数组中的哪个元素创建节点,如果为元素为0,则不创建
  77.       * @return TreeNode 返回创建的节点,最终会返回树的根节点
  78.       */  
  79.     private Entry recurCreateBinTree(int[] nums, int index) {   
  80.         //指定索引上的编号不为零上才需创建节点   
  81.         if (nums[index] != 0) {   
  82.              size++;   
  83.              Entry rootNode = new Entry(nums[index]);//根节点   
  84.             //如果有左子树则创建左子树   
  85.             if ((index + 1) * 2 <= nums.length) {   
  86.                  rootNode.left = (Entry) recurCreateBinTree(nums, (index + 1) * 2 - 1);   
  87.                 //如果还可以创建右子树,则创建   
  88.                 if ((index + 1) * 2 + 1 <= nums.length) {   
  89.                      rootNode.right = (Entry) recurCreateBinTree(nums, (index + 1) * 2);   
  90.                  }   
  91.              }   
  92.             return (Entry) rootNode;   
  93.          }   
  94.         return null;   
  95.   
  96.      }   
  97.   
  98.     public int size() {   
  99.         return size;   
  100.      }   
  101.   
  102.     //取树的最左边的节点   
  103.     public int getLast() {   
  104.          Entry e = root;   
  105.         while (e.right != null) {   
  106.              e = e.right;   
  107.          }   
  108.         return e.elem;   
  109.      }   
  110.   
  111.     //测试   
  112.     public static void main(String[] args) {   
  113.   
  114.         //创建一个满二叉树   
  115.          BinTree binTree = new BinTree();   
  116.          binTree.createFullBiTree(15);   
  117.          System.out.println(binTree.size());//15   
  118.          System.out.println(binTree.getLast());//15   
  119.   
  120.         //创建一个xx二叉树   
  121.          binTree = new BinTree();   
  122.          binTree.createFullBiTree(14);   
  123.          System.out.println(binTree.size());//14   
  124.          System.out.println(binTree.getLast());//7   
  125.   
  126.         //创建一棵非xx二叉树   
  127.          binTree = new BinTree();   
  128.         int[] nums = new int[] { 1, 2, 3, 4, 0, 0, 5, 0, 6, 0, 0, 0, 0, 7, 8 };   
  129.          binTree.createBinTree(nums);   
  130.          System.out.println(binTree.size());//8   
  131.          System.out.println(binTree.getLast());//8   
  132.   
  133.      }   
  134. }   


郑重声明:资讯 【二叉树的遍历_软件天地_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——