刚学数据结构的时候,一直不明白数据结构到底有什么用,直到对高级编程语言——Java有了进一步的认识之后,才发现数据结构的重要性,Java中的TreeMap,TreeSet等集合中包含了设计精美的数据结构,正如书中所说的那样,树是“相互之间存在一种或多种特定关系的数据元素的集合”,这种定义还是有点抽象,我的理解是“我们用来组织数据的形式”,这种形式是开放的,你可以设计自己的结构用以组织自己的数据,但是,设计良好、效率高、准确无误的数据结构还是不那么容易被设计出来的,作为小菜鸟的我也只能膜拜大神,从经典著作中总结知识了。
树的存在形式是不确定的,如下图所示:
正如图中所说的那样,设计一个特征具有某种规律性的树,用程序实现起来更为容易一些,毕竟,程序所做的计算都是一些重复性的东西,所以设计要有规律,使其解决的问题具有“普遍性”,否则,如果一个程序只能解决一个问题(甚至不是某一类的特定问题),那么这个程序的可用性就太差了。图中第二排“有章可循”的树具有什么特征呢?我们发现,每个结点的孩子阶段均不超过两个,为了描述这种树,我们称其为“二叉树”,二叉树的严格定义是:有限个结点的集合,这个集合或则是空的(空二叉树,没有结点的二叉树),或者由一个根节点和两颗互不相交的、分别称为左子树和右子树的二叉树组成的。这是一种递归定义,二叉树是由二叉树组成的。好晕....
通常的二叉树的存储表示是用链式存储结构表示的,用顺序存储(数组形式)有时候太浪费空间,闲话不说了,直接创建一个完全二叉树,利用队列,按照层进行创建,如下图解释:
根据以上提示,可以得出以下代码:
import java.util.*; class TreeNode{ public int value=-1; public TreeNode(int value){ this.value=value; } public TreeNode left=null; public TreeNode right=null; } public class Test{ public static void main(String[] args){ int[] array={1,2,3,4,5,6,7,8,9}; TreeNode root=createTree(array); preprint(root); System.out.println(); midprint(root); } static TreeNode createTree(int[] array){ TreeNode root=new TreeNode(array[0]); List<TreeNode> contain=new ArrayList<TreeNode>(); contain.add(root); TreeNode temp=null; int i=0,len=array.length; for(i=1;i<len;){ temp=contain.remove(0); if(i<len){ temp.left=new TreeNode(array[i]); i++; contain.add(temp.left); } if(i<len){ temp.right=new TreeNode(array[i]); i++; contain.add(temp.right); } } return root; } //先序遍历 static void preprint(TreeNode root){ if(root!=null){ System.out.print(root.value+" "); preprint(root.left); preprint(root.right); } } //中序遍历 static void midprint(TreeNode root){ if(root!=null){ midprint(root.left); System.out.print(root.value+" "); midprint(root.right); } } }
最后输出如下:
1 2 4 8 9 5 3 6 7
8 4 9 2 5 1 6 3 7
确定一个二叉树的结构可以从先序遍历和中序遍历结果推出,也可以从后序遍历结果和中序遍历结果推出,但是不能由先序遍历结果和后序遍历结果推出来,如下图所示:
因为二叉树的孩子有左右之分,故而不能仅有先序和后序就能判断出树的结构的。二叉树的用处很多,如红黑树、哈夫曼树均是基于二叉树构建的。