树的初探

      最开始接触树是在离散数学的课堂上,只是觉得这个概念十分生动形象,尤其是与森林、树叶一同出现之时。那时只是对概念有一个初步了解,从没想过会在软件领域有着这么重要的应用。经过程序的实践,我对树的概念有了更深层次的理解。

一、二叉树

   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);
	    	}
	    }
	}

  

二、哈弗曼树

     哈弗曼树实际上是最优二叉树的一种算法,通过哈弗曼树,还可以得到哈弗曼编码,对压缩及存储方面有很好的应用。

 

 

 

 

 

 

 

 

    

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值