LeeCode 算法学习(12)

题目描述

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);
    }

总结

这题考察的是二叉排序树的性质以及分而治之的思想;若能使用非递归算法的话可以省下很多的空间,但实现起来相对麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值