Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
confused what "{1,#,2,3}"
means? >
read more on how binary tree is serialized on OJ.
解题思路:
(1)空二叉树是BST
(2)若根节点R值大于左子树的最大值。且小于右子树最小值,而且左右子树都是BST。那么以R为根的树也是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) { if(root == NULL){ return true; } TreeNode* leftMaxNode = getMaxNode(root->left); TreeNode* rightMinNode = getMinNode(root->right); if(leftMaxNode!=NULL && leftMaxNode->val >= root->val){ return false; } if(rightMinNode!=NULL && rightMinNode->val <= root->val){ return false; } return isValidBST(root->left) && isValidBST(root->right); } TreeNode* getMaxNode(TreeNode* root){ if(root == NULL){ return NULL; } TreeNode* maxNode = root; TreeNode* leftMaxNode = getMaxNode(root->left); TreeNode* rightMaxNode = getMaxNode(root->right); if(leftMaxNode!=NULL && leftMaxNode->val > maxNode->val){ maxNode = leftMaxNode; } if(rightMaxNode!=NULL && rightMaxNode->val > maxNode->val){ maxNode = rightMaxNode; } return maxNode; } TreeNode* getMinNode(TreeNode* root){ if(root == NULL){ return NULL; } TreeNode* minNode = root; TreeNode* leftMinNode = getMinNode(root->left); TreeNode* rightMinNode = getMinNode(root->right); if(leftMinNode!=NULL && leftMinNode->val < minNode->val){ minNode = leftMinNode; } if(rightMinNode!=NULL && rightMinNode->val < minNode->val){ minNode = rightMinNode; } return minNode; } };