题目:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / 1 3 输出: true 示例 2: 输入: 5 / 1 4 / 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
1.递归:
满足左边的最大节点小于根节点,右边的最小节点大于根节点。
代码如下:
/** * 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: TreeNode * minNodeBST(TreeNode* root){ if(root == NULL){ return NULL; } if(root->left){ return minNodeBST(root->left); }else{ return root; } } TreeNode * maxNodeBST(TreeNode* root){ if(root == NULL){ return NULL; } if(root->right){ return maxNodeBST(root->right); }else{ return root; } } bool isValidBST(TreeNode* root) { if(root == NULL){ return true; } TreeNode * minRight = minNodeBST(root->right); if(minRight && minRight->val <= root->val){ return false; } TreeNode * maxLeft = maxNodeBST(root->left); if(maxLeft && maxLeft->val >= root->val){ return false; } return isValidBST(root->left)&&isValidBST(root->right); } };