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.
分析:首先肯定是递归的调用,相当于是有序序列的划分,左边和右边都是有序的。比如如下树:
简单地想,就是本题中不存在 顺序“反常”的数。因此可以理解为是逆序数,因此用归并排序的思想,自顶向下的想即可。
有序的序列为: 1 2 3 4 5 6 7 ,只需要判断左子树的最大值 < 根节点 < 右子树的最小值,对每一个节点递归调用即可。
代码如下:
bool isValidBST(TreeNode *root) {
if(root == NULL)return true;
TreeNode *temp1 = root->left;
TreeNode *temp2 = root->right;
for( ; temp1 && temp1->right ; temp1 = temp1->right);
for( ; temp2 && temp2->left ; temp2 = temp2->left);
if(( (temp1 == NULL) || (temp1 && ( temp1->val < root->val))) && ((temp2 == NULL) || (temp2 && (temp2->val > root->val)) ) )
return (isValidBST(root->left) && isValidBST(root->right));
return false;
}
本题的难点:左子树的最大值 < 根节点 < 右子树的最小值,刚开始编写的时候,我只是比较了左子树的根 < 根 < 右子树的根,显然是不对的。
对于二叉排序树的问题,大多是要验证其是否是有序的数字序列。