跳转至

98. 验证二叉搜索树

难度:中等

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:
    2
   / \
  1   3
输出: true

示例 2:

输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

Reference

题解

基本思路: 将二叉查找树中序展开为链表,判断链表是否是有序的。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct ListNode *insert(struct ListNode *List, int val)
{
    struct ListNode *ret = malloc(sizeof(struct ListNode));
    ret->val = val;
    ret->next = List;
    return ret;
}
struct ListNode *toList(struct TreeNode *root, struct ListNode *List)
{
    if (root == NULL)
        return List;
    List = toList(root->right, List);
    List = insert(List, root->val);
    List = toList(root->left, List);
    return List;
}
bool isValidBST(struct TreeNode* root){
    if (root == NULL)
        return true;
    struct ListNode *rec = toList(root, NULL), *cur = rec;
    do
    {
        if (cur->next == NULL)
            break;
        if (cur->val >= cur->next->val)
            return false;
        cur = cur->next;
    }
    while (true);
    return true;
}

评论