二叉搜索树的特点
- 节点的左子树只包含小于当前节点的数---特点1
- 节点的右子树只包含大于当前节点的数---特点2
- 所有左子树和右子树自身必须也是二叉搜索树---特点3
思想
在中序递归遍历过程中判断。递归三部曲:
- 确定递归函数、返回值、参数
- 终止条件--依据二叉搜索树可以为空设定
- 单层递归的逻辑--确保max_value < root->val(依据其中序遍遍历的特点)
注:采用中序遍历原因:中序遍历其结果是有序的,所以只要比较当前节点是不是大于前一节点的val
常见误区
- 终止条件误判
(root->val >root->left->val) && (root->val <root->right->val)
上述终止条件仅判定当前中间节点的左右节点符合要求,而不是左右子树的所有节点符合要求
- 采用max_value < root->val判定:存在关于全局变量max_val的初始化问题
样例中最小节点 可能是int的最小值,也可能是long long 的最小值,无法统一,因此采用最左面节点代替初始化的最小值。
代码
bool isValidBST(TreeNode* root) {
TreeNode* pre=NULL;
if(root==NULL) return true;
//中序遍历左子树
bool left=isValidBST(root->left);
//单层遍历逻辑--满足特点1,2
if(pre!=NULL && root->val >= pre->val)//max_val > root->val 采用的是全局变量初始化比较值,需要进行初始化--陷阱1,2
{
return false;
}
else
{
pre=root;//更新前一节点
}
//遍历右子树
bool right=isValidBST(root->right);
//满足特点3
return left && right;
}