[Leetcode] 255. Verify Preorder Sequence in Binary Search Tree 解题报告
来源:互联网 发布:fittime软件好用吗. 编辑:程序博客网 时间:2024/06/05 02:33
题目:
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
You may assume each number in the sequence is unique.
Follow up:
Could you do it using only constant space complexity?
思路:
1、递归法:我最开始想到的递归法,也就是以preorder[0]为哨兵,找到第一个比哨兵大的点的索引(如果所有值都比哨兵小,说明右子树为空),然后遍历右子树,一旦发现里面包含了比哨兵小的点,就说明不是合法的前序遍历序列,直接返回;否则以该点的索引为界,将数组分为两部分,分别递归判断,只有当左前序遍历序列和右前序遍历序列同时合法时,我们才返回true,否则返回false。如果假设preorder对对应的BST是平衡的,那么该算法的时间复杂度是O(nlogn),空间复杂度是O(1)。该算法能够通过所有测试数据,但是属于效率比较低的一种方法。
2、非递归法:这是在网上看到的一种巧妙解法。对于一个BST的前序序列而言,如果某段序列为一个递减序列,说明这是一段沿着左子树的路径,直到遇到一个比前一个大的值,说明此时我们已经来到某个结点的右子树上了,而此时可以得出一个此后序列的下界值,也就是此后序列的任意一个值必须要比这个结点的父节点的值大。
那么当我们碰到一个比之前结点大的值如何找到他的父结点呢?可以借助一个栈,即如果当前结点比栈顶元素小,就入栈,如果当前值大于栈顶值i,则让所有比当前结点小的值都出栈,直到栈顶元素比当前结点大,则最后一个出栈的比当前结点小的值就是当前结点的父结点,我们只要在栈元素出栈的时候更新最小下界,再将当前元素入栈即可。该算法的时间复杂度是O(n),空间复杂度是O(1)。但是如果允许修改preorder的值,则可以用原数组来模拟栈,从而将空间复杂度降低到O(1)。
代码:
1、递归法:
class Solution {public: bool verifyPreorder(vector<int>& preorder) { if (preorder.size() == 0) { return true; } return verifyPreorder(preorder, 0, preorder.size() - 1); }private: bool verifyPreorder(vector<int> &preorder, int start, int end) { if (start >= end) { return true; } int root_val = preorder[start]; int first_right = start + 1; while (first_right <= end && preorder[first_right] < root_val) { ++first_right; } for (int i = first_right; i <= end; ++i) { if (preorder[i] < root_val) { return false; } } bool left = verifyPreorder(preorder, start + 1, first_right - 1); bool right = verifyPreorder(preorder, first_right, end); return left && right; }};
2、非递归法:
class Solution {public: bool verifyPreorder(vector<int>& preorder) { int k = -1, min_value = INT_MIN; for (auto val : preorder) { if (val < min_value) { return false; } while (k >= 0 && val > preorder[k]) {// update the min_value min_value = preorder[k--]; } preorder[++k] = val; } return true; }};
- [leetcode] 255. Verify Preorder Sequence in Binary Search Tree 解题报告
- [Leetcode] 255. Verify Preorder Sequence in Binary Search Tree 解题报告
- LeetCode 255. Verify Preorder Sequence in Binary Search Tree
- Leetcode 255. Verify Preorder Sequence in Binary Search Tree
- [Leetcode]Verify Preorder Sequence in Binary Search Tree
- LeetCode 题解(264) : Verify Preorder Sequence in Binary Search Tree:
- *LeetCode-Verify Preorder Sequence in Binary Search Tree
- Leetcode 255 Verify Preorder Sequence in Binary Search Tree
- Verify Preorder Sequence in Binary Search Tree
- Verify Preorder Sequence in Binary Search Tree
- 255. Verify Preorder Sequence in Binary Search Tree
- 255. Verify Preorder Sequence in Binary Search Tree
- Leetcode 255. Verify Preorder Sequence in Binary Search Tree (Medium) (cpp)
- [LeetCode255]Verify Preorder Sequence in Binary Search Tree
- [leetcode 255] Verify Preorder Sequence in Binary Search Tree ---先序遍历验证二叉搜索树
- LeetCode 255. Verify Preorder Sequence in Binary Search Tree(检查二叉搜索树的前序遍历)
- [leetcode] 331. Verify Preorder Serialization of a Binary Tree 解题报告
- leetcode 331. Verify Preorder Serialization of a Binary Tree 解题报告
- php提取字符串中的数字
- 【程序员的手艺活儿】vim命令快速掌握
- 20day-、针对UI综合练习(网易彩票)的总结
- Kubernetes
- MatConvNet框架下mnist数据集测试
- [Leetcode] 255. Verify Preorder Sequence in Binary Search Tree 解题报告
- 写一个function,清除字符串前后两端的空格
- Java单元测试工具:JUnit4(四)——JUnit测试套件使用及参数化设置
- HTTP Live Streaming直播(iOS直播)技术分析与实现——牛人
- 搭建Nginx服务器
- datacleaner
- Android如何做到应用程序图标隐藏,由第三方程序启动
- MeasureSpec笔记
- Ubuntu 14.04 安装 Sublime Text 3