文章目录
- 1. 题目信息
- 2. 解题
- 2.1 递归中序
- 2.2 非递归中序
1. 题目信息
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:输入:2/ \1 3
输出: true
示例 2:输入:5/ \1 4/ \3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 递归中序
- 二叉搜索树的中序(左根右)输出是非降序列(不能相等的话,是升序的)。
class Solution {
public:bool isValidBST(TreeNode* root) {if(!root)return true;long prev = INT64_MIN;bool valid = true;isValid(root, prev, valid);return valid;}void isValid(TreeNode* root, long &prev, bool &valid){if(!valid || !root)return;isValid(root->left, prev, valid);if(valid)valid = (root->val > prev);prev = root->val;isValid(root->right, prev, valid);}
};
2.2 非递归中序
利用栈递归改循环
class Solution {
public:bool isValidBST(TreeNode* root) {if(!root)return true;long prev = INT64_MIN;bool valid = true;stack<TreeNode*> stk;TreeNode *cur = root;while(cur != NULL || !stk.empty()){while(cur != NULL){stk.push(cur);cur = cur->left;}cur = stk.top();stk.pop();if(cur->val <= prev)return false;prev = cur->val;cur = cur->right;}return valid;}
};