LeetCode

来源:互联网 发布:seo教程网 编辑:程序博客网 时间:2024/05/20 13:16


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.

Example 1:

    2   / \  1   3
Binary tree [2,1,3], return true.

Example 2:

    1   / \  2   3
Binary tree [1,2,3], return false.

借助先序遍历(中根遍历)来判断是否是二叉查找树。时间复杂度O(n),空间复杂度O(n)

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isValidBST(TreeNode* root) {        if (!root) return true;        stack<TreeNode*> s;        unordered_map<TreeNode*, bool> vis;        long ans = LONG_MIN;        s.push(root);        while (!s.empty()) {            TreeNode* cur = s.top();            if (cur->left && vis.find(cur) == vis.end()) {                s.push(cur->left);                vis[cur] = true;            }            else {                s.pop();                if (cur->val <= ans) return false;                ans = cur->val;                if (cur->right) s.push(cur->right);            }        }        return true;    }};
最近一直在避免使用递归,但是递归的方法也还是要会的。
/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isValidBST(TreeNode* root) {        long long mie = LONG_MIN;        return solve(root, mie);    }    bool solve(TreeNode* root, long long &mie) {        if (!root) return true;        if (!solve(root->left, mie)) return false;        if (root->val <= mie) return false;        mie = root->val;        return solve(root->right, mie);    }};