《程序员面试金典》--二叉查找树的判断
2015-10-24 14:55
351 查看
/************************************************************************************************************
题目描述:
请实现一个函数,检查一棵二叉树是否为二叉查找树。
给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。
***********************************************************************************************************/
题目分析:
<方法1>
首先我们想到的是二叉树中序遍历后的结果是有序的,根据这个结果,我们可以中序遍历二叉树,并把遍历结果存放在一个数组里面,然后判断这个数组大小是否是有序数组,如果是有序数组,则是二叉查找树,否则就不是。
这个方法的时间复杂度是O(N),但是空间复杂度比较高,需要浪费O(N)的存储空间。
<方法2>
其实在<方法1>的基础上,我们可以在中序遍历的同时,比较大小,每次记录下上次遍历过的元素的值,如果当前元素的值大于上次遍历元素的值,则接着遍历,否则返回false,因为这个记录是一个址传递,所以需要用到引用形参进行传递。
这个方法的时间复杂度与<方法1>的时间复杂度相同,只是空间复杂度只需要一个元素O(1)。
代码实现如下:
可以根据二叉查找树的定义来判断,二叉树的定义,所有左子树的节点小于根节点,所有右子树的节点大于根节点,并且左右子树也是二叉查找树。所以在递归的过程中,我们只需要传递两个参数(当前根节点对应的二叉树的所有节点的最大值和最小值),同时不断的更新这两个参数,如果当前节点的值不在这两个数范围中,则直接返回false,否则接着递归便可。
代码实现如下:
题目描述:
请实现一个函数,检查一棵二叉树是否为二叉查找树。
给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。
***********************************************************************************************************/
题目分析:
<方法1>
首先我们想到的是二叉树中序遍历后的结果是有序的,根据这个结果,我们可以中序遍历二叉树,并把遍历结果存放在一个数组里面,然后判断这个数组大小是否是有序数组,如果是有序数组,则是二叉查找树,否则就不是。
这个方法的时间复杂度是O(N),但是空间复杂度比较高,需要浪费O(N)的存储空间。
<方法2>
其实在<方法1>的基础上,我们可以在中序遍历的同时,比较大小,每次记录下上次遍历过的元素的值,如果当前元素的值大于上次遍历元素的值,则接着遍历,否则返回false,因为这个记录是一个址传递,所以需要用到引用形参进行传递。
这个方法的时间复杂度与<方法1>的时间复杂度相同,只是空间复杂度只需要一个元素O(1)。
代码实现如下:
class Checker { public: bool checkBST(TreeNode* root) { // write code here int min=INT_MIN; return method1(root,min); } bool method1(TreeNode* root,int &last) { if(root==NULL) return true; if(!method1(root->left,last)) return false; if(root->val<last) return false; last=root->val; if(!method1(root->right,last)) return false; return true; } };<方法3>
可以根据二叉查找树的定义来判断,二叉树的定义,所有左子树的节点小于根节点,所有右子树的节点大于根节点,并且左右子树也是二叉查找树。所以在递归的过程中,我们只需要传递两个参数(当前根节点对应的二叉树的所有节点的最大值和最小值),同时不断的更新这两个参数,如果当前节点的值不在这两个数范围中,则直接返回false,否则接着递归便可。
代码实现如下:
class Checker { public: bool checkBST(TreeNode* root) { // write code here return method2(root,INT_MIN,INT_MAX); } bool method2(TreeNode* root,int min,int max) { if(root==NULL) return true; if(root->val<min||root->val>max) return false; return method2(root->left,min,root->val)&&method2(root->right,root->val,max); } };
相关文章推荐
- 芒果iOS开发人事面试问题及答案汇总二
- 芒果iOS开发人事面试问题及答案汇总一
- Java程序员们最常犯的10个错误
- 面试的一些问题
- java面试宝典
- 就国内某个程序员问答网站的简单的分析
- 面试题23:从上往下打印二叉树
- ios初次面试(20151023)
- 面试题23:从上往下打印二叉树
- 如果你身边有程序员 今天对他好一点
- Android程序员的一些面试建议
- 黑马程序员_JavaIO流(二)
- HashTable-HashMap(Android,Java最常见面试题)
- 庆祝程序员节,入驻杭州云栖小镇
- C#程序员经常用到的10个实用代码片段
- (九)黑马程序员——oc基础之分类与协议
- EMBA提前面试准备技巧
- (八)黑马程序员——Foundation框架之NSString的常用方法
- 月薪3万的程序员都避开了哪些坑
- ——黑马程序员——编程老手与高手的误区