98. Validate Binary Search Tree

214人阅读 评论(0) 收藏 举报
分类:
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.

基本问题,判定二叉查找树是否成立。注意binary tree,二叉树,只是形状上有要求,只有二叉查找树,也就是这里的BST,才有我们通常意义上的左小右大性质。这里的验证第一反应就是递归啊,每一次递归要求左子树小于根,右子树大于根。但注意,这只是局部的要求,整体上还得保持一致,还得保持跟之前的节点间的大小关系。所以我们递归函数不仅传递节点,还传递合理的动态范围。

方法一:divide and conquer

bool isValidBST(TreeNode* root) {
    return helper(root, INT_MIN, INT_MAX);
}
bool helper (TreeNode* t, int val_min, int val_max) {
    if (t == NULL) return true;
    if (t->val >= val_min && t->val <= val_max) {
        if (t->left != NULL) {
            if (val_min == t->val) return false;//避免二者都是INT_MIN
            if (!helper(t->left, val_min, t->val-1)) return false;
        }
        if (t->right != NULL) {
            if (val_max == t->val) return false;//避免二者都是INT_MAX
            if (!helper(t->right, t->val+1, val_max)) return false;
        }
        return true;
    }
    return false;
}

其实这里的递归很好解决,需要注意的问题是动态范围的范围问题,因为测试用例里出现了很多INT的最大最小值。所以我们采用了闭区间作为范围,保证了可以等于INT_MAX, INT_MIN, 然后传递新的动态范围的时候提前做了预判,如果两者都等于MAX或者MIN,加一减一都失效,所以提前判断下。

方法二:中序遍历二叉树inorder traverse

因为二叉查找树中序遍历后输出应该是升序序列,所以可以从这一点上遍历BST来检查。
version 1:

bool isValidBST(TreeNode *root) {
    vector<int> res;
    printTree(root, res);
    for (int i = 1; i < res.size(); i++) {
        if (res[i] <= res[i-1]) return false;
    }
    return true;
}
void printTree (TreeNode *t, vector<int>& res) {
    if (t == NULL) return;
    if (t->left != NULL) printTree(t->left, res);
    res.push_back(t->val);
    if (t->right != NULL) printTree(t->right, res);
}

输出到int型数组里,再遍历数组。省去了数据类型的边界问题。
当然,也没有必要非要这么实在的把所有值存好,可以更进一步省去内存消耗。
version 2:

class Solution {
private: 
    TreeNode *lastNode = NULL;
public:
    bool isValidBST(TreeNode *root) {
        if (root == NULL) return true;
        if (!isValidBST(root->left)) return false;
        if (lastNode != NULL && lastNode->val >= root->val) return false;
        lastNode = root;
        return (isValidBST(root->right));
    }
};

用一个lastNode贯穿始终,因为我们只需要判断是否是严格的升序序列就行。

查看评论

【LeetCode】Validate Binary Search Tree 解题报告

今天CSDN博客发生异常,折腾了大半天终于发出了这篇博文。 【题目】 Given a binary tree, determine if it is a valid binary sear...
  • ljiabin
  • ljiabin
  • 2014-12-03 16:58:25
  • 9775

LeetCode 98 — Validate Binary Search Tree(C++ Java Python)

题目:http://oj.leetcode.com/problems/validate-binary-search-tree/ Given a binary tree, determine if ...
  • dragon_dream
  • dragon_dream
  • 2014-04-02 09:51:35
  • 2272

LeetCode(98)Validate Binary Search Tree

题目如下: 分析如下: 这道题目如果不用递归,可以利用一个特点来做判断,就是中序遍历树的时候,得到的node中的值一定是递增的。如果用递归,可以用题目给定的定义做判断。 我的代码 //104ms通过大...
  • feliciafay
  • feliciafay
  • 2014-01-17 10:15:46
  • 1151

Leetcode 98. Validate Binary Search Tree C++及javascript解答,不同语言不同玩法

题意:给定一棵二叉树,写程序判断这颗二叉树是否为合法的二分查找树(对于节点root,其所有左子树中节点都满足 node.val root.val) 转载请注明出处:http://blog.csdn...
  • sunny606
  • sunny606
  • 2017-03-15 22:03:34
  • 245

leetcode 98 Validate Binary Search Tree (python)

python Validate Binary Search Tree
  • sxingming
  • sxingming
  • 2016-07-27 08:36:02
  • 791

98. Validate Binary Search Tree(Python3)

98. Validate Binary Search Tree(Python3) 题目 Given a binary tree, determine if it is a valid binary...
  • grape875499765
  • grape875499765
  • 2018-01-31 09:39:57
  • 39

Validate Binary Search Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/validate-binary-search-tree/  这道题是检查一颗二分查找树是否合法,二分查找树是非常常见的一种...
  • linhuanmars
  • linhuanmars
  • 2014-04-16 04:34:52
  • 11823

[C++]LeetCode: 122 Validate Binary Search Tree (是否是合法BST树)

题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST i...
  • cinderella_niu
  • cinderella_niu
  • 2015-01-25 17:01:28
  • 861

LeetCode -- Validate Binary Search Tree

LeetCode -- Validate Binary Search Tree
  • csharp25
  • csharp25
  • 2015-10-17 00:33:51
  • 1032

Validate binary search tree

关于这道题目,不得不感慨leetcode真的是一个不错的网站,之前的代码是有bug的,当时AC了,现在测试用例更加完善了,于是不能AC了。 题目描述: Given a binary tree,...
  • C12345SDN
  • C12345SDN
  • 2014-11-16 22:31:58
  • 926
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 1818
    排名: 2万+
    文章分类
    最新评论