题目链接:leetcode98
题目大意
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
解题思路
树形遍历
自行定义一个搜索二叉树的上界和下界,对于一个节点如果在这个上下界之外就不为 BST ,否则就是。对于左子树上界则更新为当且节点的值,对于右子树则把下界更新为当前节点的值。
中序遍历
利用中序遍历就不用考虑上界的问题,因为遍历的顺序是从左子树到根节点到右子树,所以不断更新下界即可。
中序遍历非递归
略,具体思路就是利用栈的形式实现非递归的中序遍历。
代码实现
树形遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
return isBst(root, ~(1ll<<63), 1ll<<63);
}
bool isBst(TreeNode* root, long long mx, long long mi) {
if (root == NULL) return true;
if (root->val >= mx || root->val <= mi) return false;
return isBst(root->left, root->val, mi) && isBst(root->right, mx, root->val);
}
};
中序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
long long mi = 1ll<<63;
return isBst(root, mi);
}
bool isBst(TreeNode* root, long long& mi) {
if (root == NULL) return true;
if (!isBst(root->left, mi)) return false;
if (root->val <= mi) return false;
mi = root->val;
return isBst(root->right, mi);
}
};