最开始接触树是在离散数学的课堂上,只是觉得这个概念十分生动形象,尤其是与森林、树叶一同出现之时。那时只是对概念有一个初步了解,从没想过会在软件领域有着这么重要的应用。经过程序的实践,我对树的概念有了更深层次的理解。
一、二叉树
1、基本概念:
一棵二叉树由结点的有限集合组成,结点分为根节点和子节点。无子结点的结点被称为叶结点,有子结点的结点则被称为分支结点和局部结点。
结点M的深度就是从根结点到M的路径的长度,树的高度就等于最深结点深度加1。
2、树的节点类的构造
树的结点之间的联系与双向链表相仿,只不过二叉树有两个分支,并且分左支和右支。只要解决了这个问题,树的构造就迎刃而解了。
3、周游二叉树
周游二叉树分三种顺序:
前序周游:打印的第一个结点是根结点,接下来打印所有左子树的结点,最后打印的是右子树的结点。
后序周游:先访问子结点,再访问结点,自下而上。应用:在释放树的所有节点占用的存储空间时,应先删除子节点,再删除节点本身。
中序周游:先访问左子结点,在访问该节点,最后访问右子节点。应用:二叉搜索树。
/**
* 周游树
*/
public void printTree(TreeNode root){
//前序
// Object obj = root.getObj();
// System.out.println(obj+">>>>>>>>>>>");
TreeNode left = root.getLeft();
if(left!=null){
printTree(left);
}
Object obj = root.getObj();
//中序
System.out.println(obj+">>>>>>>>>>>");
TreeNode right = root.getRight();
if(right!=null){
printTree(right);
}
//后序
// Object obj = root.getObj();
// System.out.println(obj+">>>>>>>>>>>");
}
4、搜索树的实现
搜索树的关键就是递归的运用以及左右子树的判断,因此要定义一个传入TreeNode变量的的方法,通过传入子节点实现递归。
/**
* 将数组转成搜索树
* @param array
* @return
*/
public void arrayToNode(TreeNode node,int array ){
if(array<(Integer)node.getObj()){
if(node.getLeft()==null){
TreeNode newnode = new TreeNode(array);
node.setLeft(newnode);
newnode.setParent(node);
}else{
arrayToNode(node.getLeft(),array);
}
}else{
if(node.getRight()==null){
TreeNode newnode = new TreeNode(array);
node.setRight(newnode);
newnode.setParent(node);
}else{
arrayToNode(node.getRight(),array);
}
}
}
二、哈弗曼树
哈弗曼树实际上是最优二叉树的一种算法,通过哈弗曼树,还可以得到哈弗曼编码,对压缩及存储方面有很好的应用。