题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/
1 3
输出: true
示例 2:
输入:
5
/
1 4
/
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解题思路
用树的后序遍历思想,对于每次遍历到的根节点,根据左右子树是否为BST分为四种情况:
- 若左右子树都不为空,则分别递归判断左右子树是否为BST,并且分别传回左右子树的最小值和最大值。若左右子树都为BST,则比较左子树最大值是否小于根结点值以及右子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
- 若左子树为空右子树不为空,则判断右子树是否为BST,并且传回右子树的最小值和最大值。若右子树为BST,则比较右子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
- 若右子树为空左子树不为空,则判断左子树是否为BST,并且传回左子树的最小值和最大值。若左子树为BST,则比较左子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
- 若左右子树都为空,则本子树是BST,并记录根结点值为此子树的最小值与最大值
代码
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isValidBST(TreeNode* root) { 13 if(!root) return true; 14 int minNode, maxNode; 15 return isBST(root, minNode, maxNode); 16 } 17 bool isBST(TreeNode* root, int &minNode, int &maxNode){ 18 int left_max, left_min, right_max, right_min; 19 bool left = true, right = true; 20 if(root->left && root->right){ 21 left = isBST(root->left, left_min, left_max); 22 right = isBST(root->right, right_min, right_max); 23 if(left && right){ 24 minNode = min(left_min, root->val); 25 maxNode = max(right_max, root->val); 26 if(left_max < root->val && right_min > root->val) 27 return true; 28 } 29 } 30 if(root->left && !root->right){ 31 left = isBST(root->left, left_min, left_max); 32 if(left){ 33 minNode = min(left_min, root->val); 34 maxNode = root->val; 35 if(left_max < root->val) 36 return true; 37 } 38 } 39 if(!root->left && root->right){ 40 right = isBST(root->right, right_min, right_max); 41 if(right){ 42 maxNode = max(right_max, root->val); 43 minNode = root->val; 44 if(right_min > root->val) 45 return true; 46 } 47 } 48 if(!root->left && !root->right){ 49 minNode = maxNode = root->val; 50 return true; 51 } 52 return false; 53 } 54 };