数据结构与算法之二叉树

树(Tree)

数据结构中的树和我们现实生活中的树非常像,从根部发散出枝丫。

看下面的结构:

			node(1)
			   |
		|——————————|——————————|
	   node(2) 	node(3)   node(4)
	     |			      |
        |——————————|		  node(7)	
    node(5)	node(6)		

数据结构是由各个节点组成的,分别包括:父节点、子节点、兄弟节点、根节点,这个很好理解,你看上图就能理解。

树中还有几个概念:高度(Height)、深度(Depth)、层(Level)

高度=节点到叶子节点的最长路径(边数)

深度=根节点到这个节点所经历的边的个数

层数=节点的高度+1

树的高度=根节点的高度

了解了树的基本概念,我们再来看二叉树。

二叉树

每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。

二叉树有两种特殊情况:满二叉树和完全二叉树。

满二叉树:除了最后一层是叶子节点,所有节点都有左右子节点,这样就形成了完整的一个二叉树,没有高度差(即不会出现节点之间高度不一样的情况)。

完全二叉树:除了最后两层是叶子节点(即高度差只有一层),所有叶子节点如果只有一个,都靠左排列。

存储方法

存储一棵二叉树,有两种方法:
一种是基于指针或者引用的二叉链式存储法
一种是基于数组的顺序存储法。

链式存储法:基于链表存储,简单、直观,通过左右指针,表示节点的左右子节点。

		            data(left,right)
		     |		                |
		  data(l,r)		     data(l,r)
		|	    |		  |		   |
	data(l,r)	data(l,r)	data(l,r)	data(l,r)

顺序存储法:基于数组,需要通过下标计算,映射节点到对应位置。存储方式:把根节点存储在下标= 1 的位置,那根节点的左子节点存储在根节点下标* 2 = 2 的位置,右子节点存储在根节点下标* 2 + 1 = 3 的位置,以此类推。

			    data(1)
			|            |
		data(2)	           data(3)
	      |	       |	  |	   |
	data(4)	   data(5)      data(6)	 data(7)

如果是满二叉树和完全二叉树,则可以用顺序存储法,因为基本不会有太多空出来的位置。

如果不是满二叉树和完全二叉树,则可以用链式存储法,因为这样可以节省空间。

二叉树的遍历

有三种,前序遍历、中序遍历和后序遍历。

如果要打印二叉树,使用递归是最合适的了。