这篇总结主要介绍一个比较常见的数据结构--二叉查找树。二叉查找树既是一颗树,又带有特别的有序性质,所以考察的方式比较多而且灵活,属于面试题目中的常客。LeetCode中关于二叉查找树的题目有以下几道:
Validate Binary Search Tree
Recover Binary Search Tree
Unique Binary Search Trees
Unique Binary Search Trees II
Convert Sorted Array to Binary Search Tree
Convert Sorted List to Binary Search Tree

先来看看最基本的Validate Binary Search Tree, 就是判断一个树是不是二叉查找树。比较简单而且明了的方法就是利用二叉查找树的中序遍历有序的性质,只要对树进行一次中序遍历,而其中的结点都满足有序即 可,实现上就是维护一个前驱结点,每次判断前驱结点比当前结点要小。另一种方法是根据二叉查找树的定义来实现,保证结点满足它的左子树的每个结点比当前结 点值小,右子树的每个结点比当前结点值大,实现上就是对于每个结点保存左右界,然后进行递归判断左右界不会违背即可。

Recover Binary Search Tree这道题目还是利用二叉查找树的主要性质,就是中序遍历是有序。那么如果其中有元素被调换了,意味着中序遍历中必然出现违背有序的情况。主要考虑到就是出现违背的次数问题。这里有两种情况:
(1)如果是中序遍历相邻的两个元素被调换了,很容易想到就只需会出现一次违反情况,只需要把这个两个节点记录下来最后调换值就可以;
(2)如果是不相邻的两个元素被调换了,会发生两次逆序的情况,那么这时候需要调换的元素应该是第一次逆序前面的元素,和第二次逆序后面的元素。 

Unique Binary Search Trees这 道题要求可行的二叉查找树的数量,其实二叉查找树可以任意取根,只要满足中序遍历有序的要求就可以。从处理子问题的角度来看,选取一个结点为根,就把结点 切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,所以总的数量是将以所有结点为根的可行结果累加起来。这其实是一个卡特 兰数的模型,所以按照公式进行实现就可以。而Unique Binary Search Trees II则不能用卡特兰数,因为要求出所有结果,所以还是得走递归遍历的过程,然后把生成树来的树接上。

Convert Sorted Array to Binary Search TreeConvert Sorted List to Binary Search Tree则是属于二叉查找树的构造问题,针对两种不同数据结构数组和链表进行构造。其实方法都是一样,就是递归对窗口进行圈限,然后用中间的结点作为当前根,再递归生成左右子树。链表的构造要稍微绕一些,因为要通过中序遍历走到第一个结点,然后递进链表。

这篇总结主要介绍LeetCode中关于二叉查找树的题目,二叉查找树因为是基本数据结构加上有可利用的有序性质,还是在面试中相当常见的,对于性质理解要深刻,实现要熟练哈。
posted on 2015-01-05 15:54  风云逸  阅读(70)  评论(0编辑  收藏  举报