/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 */ bool isValidBST(TreeNode* root) { // write code here //为空直接返回 if(root==nullptr) return true; //左右子树不为排序树也直接返回 bool leftIs=isValidBST(root->left); bool rightIs=isValidBST(root->right); if(leftIs==false||rightIs==false) return false; //判断当前结点是否满足 else { TreeNode* btL=root->left; TreeNode* btR=root->right; while(btL!=nullptr&&btL->right!=nullptr) { btL=btL->right; } if(btL!=nullptr&&btL->val>root->val) return false; while(btR!=nullptr&&btR->left!=nullptr) { btR=btR->left; } if(btR!=nullptr&&btR->val<root->val) return false; } return true; } };
使用递归的方法解决此问题
1.空树为搜索树
2.如果左右子树不都是搜索树,那么返回false;
否则,判断1.根结点的值是否大于左子树最大值或者左子树为空,2.根结点的值是否小于右子树最小值或者右子树为空
总结:
由于先假定能判断左右子树是否是排序树倒推,这是后序遍历的思想
找排序树最大最小值是容易的