题目描述
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.
题目大意
判断一棵树是否为二叉排序树。
思路分析
这个问题可以分成:左、右子树都为二叉排序树,且左子树结点都小于根节点,右子树结点都大于根节点吗?
根据这种分开的子问题,可以想到使用递归的思想;要保证根节点与子树结点之间的大小关系,也就是确定结点值的合法范围,就需要传递两个参数:上界和下界;而根据二叉排序树的性质,遍历左子树时只需传递当前结点的值作为上界,遍历右子树时只需传递当前结点的值作为下界。
关键代码
bool BSTvalid(TreeNode* node, int low, bool lowValid, int high, bool highValid) {
// 这里low(high)Valid的设置是考虑了初始时上界和下界都无效的情况
if (lowValid && node->val <= low) return false;
if (highValid && node->val >= high) return false;
bool flag = true;
// 左子树
if (node->left != NULL && !BSTvalid(node->left, low, lowValid, node->val, true)) {
flag = false;
}
// 右子树
if (flag && node->right != NULL && !BSTvalid(node->right, node->val, true, high, highValid)) {
flag = false;
}
return flag;
}
bool isValidBST(TreeNode* root) {
if (root == NULL)
return true;
else
return BSTvalid(root,NULL,false,NULL,false);
}
总结
这题考察的是二叉排序树的性质以及分而治之的思想;若能使用非递归算法的话可以省下很多的空间,但实现起来相对麻烦。