0%

validate-binary-search-tree

题目描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

题解

这不就,递归吗?有快一点的方法吗……

注意不能相等哦。还要注意左边的最大值小于右边的最小值。

第一版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int getMax(TreeNode* root)
{
if (!root->right)
return root->val;
return getMax(root->right);
}
int getMin(TreeNode* root)
{
if (!root->left)
return root->val;
return getMax(root->left);
}
bool isValidBST(TreeNode* root) {
if (root == NULL || (root->left == NULL && root->right == NULL))
return true;
if ((root->left&&root->val<=getMax(root->left)) || (root->right&&root->val>=getMin(root->right)))
return false;
return isValidBST(root->left) && isValidBST(root->right);
}

执行用时 :24 ms, 在所有 C++ 提交中击败了27.46%的用户

内存消耗 :20.1 MB, 在所有 C++ 提交中击败了100.00%的用户

做了很多重复的工作,所以时间效率很低。再改改。

我真是傻逼。中序遍历啊!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool midtravel(TreeNode* root,stack<int>& s)
{
if (root == NULL)
return true;
if (root->left)
if(!midtravel(root->left,s))return false;
if (!s.empty() && s.top() >= root->val)return false;
s.push(root->val);
if (root->right)
if (!midtravel(root->right, s))return false;
return true;
}
bool isValidBST(TreeNode* root) {
if (root == NULL || (root->left == NULL && root->right == NULL))
return true;
stack<int> s;
return midtravel(root, s);
}

执行用时 :16 ms, 在所有 C++ 提交中击败了76.37%的用户

内存消耗 :20.3 MB, 在所有 C++ 提交中击败了97.25%的用户

再来个下酒菜

1
2
3
4
5
6
7
8
9
10
11
12
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL)
{
if (q == NULL)
return true;
else
return false;
}
if (q == NULL)return false;
if (p->val != q->val)return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}