https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/
判断一个二叉搜索树是否合法。
考察二叉搜索树的定义,注意这里不包括等于号。
思路:按照(左子树,当前节点,右子树)(不记得是什么遍历)去遍历,得到的序列应该是严格递增的,由此判断。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
cnt = 0;
myD(root);
for (int i = 1; i < cnt; i++) {
if (a[i-1]>=a[i]) {
return false;
}
}
return true;
}
int a[10000];
int cnt;
void myD(TreeNode* cur) {
if (cur->left != NULL) myD(cur->left);
a[cnt++] = cur->val;
if (cur->right != NULL) myD(cur->right);
}
};
前几天面试有类似不让写递归的,没写出来很尴尬。
递归本质大概是pc指针压栈,实现非递归算法版本大概利用栈就可以了。上面的应该是中序遍历用栈优化下。中序结果缓存前一位就好了,不用存储整个遍历结果。
class Solution {
public:
stack<TreeNode*> s;
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
TreeNode* cur = root;
int thL = -0x7fffffff;
bool o = true;
while (!s.empty() || cur) {
if (cur) {
s.push(cur);
cur = cur->left;
}
else {
cur = s.top();
s.pop();
if (cur == NULL) continue;
if (o) {
thL = cur->val;
cur = cur->right;
o = false;
continue;
}
if (thL >= cur->val) {
return false;
}
else {
thL = cur->val;
}
cur = cur->right;
}
}
return true;
}
};