总结之树

树有很多中,包括二叉树,AVL树(平衡二叉树),查找二叉树,完全二叉树,霍夫曼树(最优二叉树),红黑树等等。

对这些树的概念和应用场景,要有一个清楚的了解。

基础概念

二叉树:每个结点,最多有两个子树的有序树。二叉树常用来实现二叉查找树和二叉堆。

二叉查找树:也叫二叉搜索树或者二叉排序树。主要具有以下的性质,如果左子树不为空,则左子树的所有结点值均小于根节点;如果右子树不为空,则右子树的所有结点均大于它的根节点的值;左右子树也分别是二叉查找树。二叉查找树的中序遍历是一个有序的数列。

完全二叉树:除了最后一层,其它层的结点数都达到最大值;最后一层只缺少右边的若干结点。

堆:堆一般指的是二叉堆。二叉堆是一个完全二叉树或者近似完全二叉树。二叉堆满足两个特性,一个是父节点的键值总是大于或者等于任何一个子结点的键值;每个结点的左子树和右子树都是二叉堆。父节点的键值大于或者等于任何一个子节点的键值,则为最大堆;父节点的键值小于或者等于任何一个子节点的键值,则为最小堆。二叉堆可以用数组表示(按层遍历?),i的父节点的小标为(i-1)/2,左右子结点分别为2*i+1和2*i+2。比较常用的是堆排序,可以见排序那章总结。

平衡二叉树:也叫AVL树(但是不同于AVL算法),它的特点是要么是空要么左右子树的高度差绝对值不超过1,并且左右两个子树都是平衡二叉树。构造和调整平衡二叉树的常用方法有红黑树,AVL等。

红黑树:是一种自平衡二叉查找树,也叫做“对称二叉B树”。C++中的STL很多部分,包括set,multiset,map,multimap都应用了红黑树。

霍夫曼树(最优二叉树):由n个权值作为n个叶子节点,构造一颗二叉树,若带权路径长度达到最小,则称为最优二叉树,也叫霍夫曼树。

权,就是树中结点赋予的某种含义的数值。比如说频率。

带权路径长度,从根节点到该结点之间的路径长度乘以权值。而树的带权路径长度,是所有叶子节点的带全路径长度之和。

霍夫曼树的构造,使用的是贪心算法。具体可以百度百科一下。

它在通信中有应用,可以用于报文编码,使得报文的编码长度最短。


关于二叉树的递归

说到递归。先说一下return。 return只能将当前循环的值往上一层返回,而不能终止递归继续。如果我们需要终止递归,那么就需要新加一些条件,比如说定义一个全局变量来判断。百度上有一个文章说这个: http://jingyan.baidu.com/article/c45ad29cf51378051753e200.html
写递归的时候一定要记得它的结束条件,否则会陷入无限递归的状态。
在理解递归的时候,要从函数的功能意义的角度去理解,一个问题如何被分解成它的子问题,这样递归代码就容易理解了。千万不要,通过分析堆栈,分析一个一个函数的调用过程,输出结果来分析递归的算法。这样只会把自己搞晕。其实递归的本质也是函数调用,调用自己和调用其它函数其实没有什么区别。
有一个文章写得不错,可以参考一下:
http://blog.csdn.net/chencheng126/article/details/40404915

-------------------------------------------------------------------------------------

1.前序遍历,中序遍历和后序遍历

http://blog.csdn.net/chencheng126/article/details/44049033

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.二叉树的构建

二叉树的创建,遍历。

http://blog.csdn.net/chencheng126/article/details/40075873

8.判断是否是二叉查找树(Validate Binary Search Tree

判断是否是二叉查找树,只要求中序遍历,看看是否是递增数列。

http://blog.csdn.net/chencheng126/article/details/40429999

9.有序数组转化为二叉查找树(Convert Sorted Array to Binary Search Tree)

将一个有序数组,转换为一个二叉查找树。采用二分法。
http://blog.csdn.net/chencheng126/article/details/40433585

10.二叉树的最低高度(Minimum Depth of Binary Tree)

递归思想的好题。
http://blog.csdn.net/chencheng126/article/details/40435279

11.是否存在一个和等于sum的路径(Path Sum)

递归思想。
题目只要求返回 true 或者 false,因此不需要记录路径。
由于只需要求出一个结果,因此,当左、右任意一棵子树求到了满意结果,都可以及时 return。
由于题目没有说节点的数据一定是正整数,必须要走到叶子节点才能判断,因此中途没法剪枝,只能进行朴素深搜。
http://blog.csdn.net/chencheng126/article/details/40449889


12.找到所有和等于sum的路径(Path Sum II)

递归思想。
跟上一题相比,本题是求路径本身。且要求出所有结果,左子树求到了满意结果,不能 return,要接着求右子树。
http://blog.csdn.net/chencheng126/article/details/40449907

13.最近公共祖先(Lowest Commen Ancensor)

http://blog.csdn.net/chencheng126/article/details/40474843

你可能感兴趣的:(总结之树)