树有很多中,包括二叉树,AVL树(平衡二叉树),查找二叉树,完全二叉树,霍夫曼树(最优二叉树),红黑树等等。
对这些树的概念和应用场景,要有一个清楚的了解。
基础概念
二叉树:每个结点,最多有两个子树的有序树。二叉树常用来实现二叉查找树和二叉堆。
二叉查找树:也叫二叉搜索树或者二叉排序树。主要具有以下的性质,如果左子树不为空,则左子树的所有结点值均小于根节点;如果右子树不为空,则右子树的所有结点均大于它的根节点的值;左右子树也分别是二叉查找树。二叉查找树的中序遍历是一个有序的数列。
完全二叉树:除了最后一层,其它层的结点数都达到最大值;最后一层只缺少右边的若干结点。
堆:堆一般指的是二叉堆。二叉堆是一个完全二叉树或者近似完全二叉树。二叉堆满足两个特性,一个是父节点的键值总是大于或者等于任何一个子结点的键值;每个结点的左子树和右子树都是二叉堆。父节点的键值大于或者等于任何一个子节点的键值,则为最大堆;父节点的键值小于或者等于任何一个子节点的键值,则为最小堆。二叉堆可以用数组表示(按层遍历?),i的父节点的小标为(i-1)/2,左右子结点分别为2*i+1和2*i+2。比较常用的是堆排序,可以见排序那章总结。
平衡二叉树:也叫AVL树(但是不同于AVL算法),它的特点是要么是空要么左右子树的高度差绝对值不超过1,并且左右两个子树都是平衡二叉树。构造和调整平衡二叉树的常用方法有红黑树,AVL等。
红黑树:是一种自平衡二叉查找树,也叫做“对称二叉B树”。C++中的STL很多部分,包括set,multiset,map,multimap都应用了红黑树。
霍夫曼树(最优二叉树):由n个权值作为n个叶子节点,构造一颗二叉树,若带权路径长度达到最小,则称为最优二叉树,也叫霍夫曼树。
权,就是树中结点赋予的某种含义的数值。比如说频率。
带权路径长度,从根节点到该结点之间的路径长度乘以权值。而树的带权路径长度,是所有叶子节点的带全路径长度之和。
霍夫曼树的构造,使用的是贪心算法。具体可以百度百科一下。
它在通信中有应用,可以用于报文编码,使得报文的编码长度最短。
关于二叉树的递归
-------------------------------------------------------------------------------------
1.前序遍历,中序遍历和后序遍历
2.层次遍历
http://blog.csdn.net/chencheng126/article/details/40078439
3,二叉查找树的恢复(Recover Binary Search Tree)
要注意到它的中序遍历是一个递增的数列。只要生成中序遍历,排序,然后再生成二叉查找树即可。这需要时间复杂度为O(nlogn),空间复杂度为O(n)。
如果知道有几个数据乱的话,可以用常数级的空间复杂度来实现。
http://blog.csdn.net/chencheng126/article/details/40356595
4.相同的树(Same Tree)
用递归解决这个问题,清楚简单,注意终止条件。
http://blog.csdn.net/chencheng126/article/details/40392407
5.对称树(Symmetric Tree)
也是一个递归解题的典范。
http://blog.csdn.net/chencheng126/article/details/40393589
6.平衡二叉树(Balanced Binary Tree)
用树的高度来判断是否是平衡二叉树。
如果是空树,就返回0;如果是平衡二叉树,则返回树的高度,如果不是返回-1.只要有一个函数返回了-1,则整个函数都会返回-1.
http://blog.csdn.net/chencheng126/article/details/40405457
7.二叉树的构建
8.判断是否是二叉查找树(Validate Binary Search Tree)
判断是否是二叉查找树,只要求中序遍历,看看是否是递增数列。