98.验证二叉搜索树

2018-11-28  本文已影响0人  HITZGD

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

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

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

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

示例 2:

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

字符串转TreeNode的方法

void trimLeftTrailingSpaces(string &input) {
    input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
        return !isspace(ch);
    }));
}

void trimRightTrailingSpaces(string &input) {
    input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
        return !isspace(ch);
    }).base(), input.end());
}

TreeNode* stringToTreeNode(string input) {
    trimLeftTrailingSpaces(input);
    trimRightTrailingSpaces(input);
    //input = input.substr(1, input.length() - 2);
    if (!input.size()) {
        return nullptr;
    }

    string item;
    stringstream ss;
    ss.str(input);

    getline(ss, item, ',');
    TreeNode* root = new TreeNode(stoi(item));
    queue<TreeNode*> nodeQueue;
    nodeQueue.push(root);

    while (true) {
        TreeNode* node = nodeQueue.front();
        nodeQueue.pop();

        if (!getline(ss, item, ',')) {
            break;
        }

        trimLeftTrailingSpaces(item);
        if (item != "null") {
            int leftNumber = stoi(item);
            node->left = new TreeNode(leftNumber);
            nodeQueue.push(node->left);
        }

        if (!getline(ss, item, ',')) {
            break;
        }

        trimLeftTrailingSpaces(item);
        if (item != "null") {
            int rightNumber = stoi(item);
            node->right = new TreeNode(rightNumber);
            nodeQueue.push(node->right);
        }
    }
    return root;
}

思路
1.记录子树的上界和下界,root的左子树一定小于root的值,root的右子树一定大于root的值,然后递归左子树和右子树。

class Solution {
public:
    bool isValidBST(TreeNode* root, long min, long max)
    {
        if (root == NULL) return true;
        if (root->val <= min || max <= root->val) return false;
        return isValidBST(root->left, min, root->val) && isValidBST(root->right, root->val, max);
    }
    bool isValidBST(TreeNode* root) {
        return isValidBST(root, LONG_MIN, LONG_MAX);
    }

};

2、中序遍历二叉树,并记录前继节点

class Solution2 {
    TreeNode* pre = NULL;
public:
    bool isValidBST(TreeNode* root)
    {
        if (root == NULL) return true;
        TreeNode* left = root;
        while (left->left != NULL)
        {
            left = left->left;
        }
        pre = left;
        return isValid(root);
    }
private:
    bool isValid(TreeNode* root)
    {
        if (root == NULL) return true;
        if (!isValid(root->left)) return false;
        if (root != pre && root->val <= pre->val) return false;
        pre = root;
        return isValid(root->right);
    }
};

主程序

int main() {
    string line = "2,1,3";

        TreeNode* root = stringToTreeNode(line);

        bool ret = Solution().isValidBST(root);

        string out = boolToString(ret);
        cout << out << endl;

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读