数据结构 五 :树

              一。按照国际惯例,先扯点别的。

      11020期:开奖号码57873, 中奖 41 注
      11021期:开奖号码57873, 中奖 228 注

      体育彩票1月20日晚开的是57873总共中了41注,而21日晚开的还是57873,更神奇的是竟然总共中了228注,正常人想一下连续两次摇到同样的号码概略为几何。更可笑的是竟然中奖人数反而更多。莫非是真的如大家所说,放错了视频?又或者如前几年某位程序员报的彩票内幕?不过其实这也很正常,因为这都是发生在神奇的,万能的中国。生在中国,可以见证很多奇迹,比如房价,比如股市,说到股市,向大家推荐一本袁剑的《中国证券市场批判》,讲述的是政治经济学,很不错
    二。随着这几年‘双核’,甚至‘多核’的普及,‘多核编程’已经渐渐成为程序员一个必备的技能,对于‘多核编程’,考虑更多的是架构的设计与任务的分配即负载均衡,以前的‘并发’注重的是多线程的软件环境,而现今的‘并行’则让硬件也成为了应用程序员所必须关注的一个点,应该说‘软硬兼顾’如‘文武双全’渐渐成为了一个程序员最基本的素质。就如有时候一个架构遇到了效率瓶颈,按照以往,习惯从代码优化或者设计缓存出发考虑问题,而很多时候是硬件上跟不上配套。著名的Erlang语言则擅长于‘多核’环境,它具有操作系统的一些特性:如并发线程,作业调度和内存管理等。毫无疑问,‘多核编程’是一项必将到来的革命。

    三。回到数据结构。昨天在写代码之时,还只上大一的表弟竟然跟我说起了‘二叉树’,而且说的有板有眼,更让震惊的是他学的是‘旅游管理’,和‘二叉树’八竿子打不到一起,不仅感叹岁月唏嘘,自己大学四年多少日子挥洒在了球场,多少精力挥洒在了无味的挣扎之中,拿一句比较灰的话来说,就是‘一切都他妈的是浮云’。今天说到树,说到树,我想到‘村上春树’,‘公车上树’,‘周树人’,‘山楂树’,可我就是想不起来‘二叉树’。

    四。树的一些基本概念。

    (1)根结点

    (2)叶子结点

    (3)孩子结点,兄弟结点,双亲结点。。。

    (4)二叉树:一个根结点加上左子树和右子树。

    (5)遍历分为三种:先序,中序和后序

    五。直接贴代码:

package com.ds.test4;

public class BiTree {
	
	Node root;    //根节点
	
	public BiTree(){   // 构造二叉树
		root =null;
	}
	
	public void insert(int e){    //插入元素
		root = insert(root,e);     //现行插入root,以构造根节点
	}
	
	private Node insert(Node node, int e) {
		
		if(node == null){
			node = new Node(e);            //构造根结点或者构造叶子结点
		}else{
			if(e<=node.data){
				node.left = insert(node.left,e); //递归以产生左结点
			}else{
				node.right = insert(node.right,e);//递归以产生右结点
			}
		}
		return node;
	}
	
	public void initTree(int[] array){    //用int数组初始化二叉树
		for(int i=0;i<array.length;i++){
			insert(array[i]);            //循环
		}
	}
	
	
	public void preOrder(){           //先序
		preOrder(root);    
		System.out.println();
	}
	
	public void preOrder(Node node){
		if(node == null) return;
		System.out.print(node.data + "  ");
		preOrder(node.left);
		preOrder(node.right);
	}
	
	public void inOrder(){           //中序
		inOrder(root);  
		System.out.println();
	}
	
	public void inOrder(Node node){
		if(node == null) return;
		inOrder(node.left);
		System.out.print(node.data + "  ");
		inOrder(node.right);
	}
	
	public void postOrder(){           //后序
		postOrder(root);  
		System.out.println();
	}
	
	public void postOrder(Node node){
		if(node == null) return;
		postOrder(node.left);
		postOrder(node.right);
		System.out.print(node.data + "  ");
	}

	class Node{
		
		Node left;    // 左结点
		
		Node right;   // 右结点
		
		private int data;  //数据域
		
		public Node(){}
		
		public Node(int e){   //构造结点
			this.left = null;
			this.right = null;
			this.data = e;
		}
	}
}

 


    六。测试:

运行:
    

		int[] array ={2,7,8,4,6,7,1,5,4};
		BiTree bt = new BiTree();
		bt.initTree(array);
		System.out.println("preorder:");
		bt.preOrder();
		System.out.println("inorder:");
		bt.inOrder();
		System.out.println("postorder:");
		bt.postOrder();

 
结果:
图片

    七。对于树,也有许多应用场景,如软件压缩使用的哈弗曼算法,对于软件压缩,其原理无非是是把出现频率较高的字符(字节)提取出来使用一个更短字节数的符号进行代替,而为了解压缩,则必须保留这些代替的对应关系。在数组中,具有稀疏矩阵压缩这个概念,其实也就是对于0的一个处理。

    八。总结:在这里只是对‘二叉树’进行了实现,应该说树的相关内容扩展性很强,而且现实的应用场景也很常见,所以说对于树,只是一个初探,以后还必须深入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值