您的位置:首页 > 其它

leetcode-98 Validate Binary Search Tree

2015-03-31 19:25 351 查看
思路:BST的中序遍历为一个有序序列,所以可以通过中序遍历来解此题。但需要注意的是,当弹出第一个结点时,它的值不需要和谁进行比较,所以大部分人选择将prev变量的初值设为INT_MIN,但如果弹出的第一个结点的值也为INT_MIN的时候,程序就会出错;所以更好的方法是设置一个标志flag,第一次的时候不需要比较。

中序非递归:

<span style="font-family:Microsoft YaHei;font-size:14px;">/**
 * Definition for binary tree
 * 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 *> st;
        st.push(root);
        int prev,curr;
        int flag = true;
        while(!st.empty()){
            while(st.top()){
                st.push(st.top()->left);
            }
            st.pop();
            if(!st.empty()){
                TreeNode *tmp = st.top();
                curr = tmp->val;
                st.pop();
                st.push(tmp->right);
                if(flag == true) {
                    flag = false;
                    prev = curr;
                    continue;
                }
                if(curr <= prev) return false;
                prev = curr;
            }
        }
        return true;
    }
};</span>


递归的版本(或者将prev定义为全局变量):

<span style="font-family:Microsoft YaHei;">bool helper(struct TreeNode *node,struct TreeNode **prev){
    if(node == NULL) return true;
    if(helper(node->left,prev)){
        if(*prev != NULL && (*prev)->val >= node->val) return false;
        *prev = node;
        return helper(node->right,prev);
    }
    return false;
}

bool isValidBST(struct TreeNode *root) {
    struct TreeNode *prev = NULL;
    return helper(root,&prev);
}</span>


附加:

当题目涉及到求最大最小值时,最初的比较数字就应当设置为INT_MAX或INT_MIN,更为安全。

<limits.h>中有INT_MAX和INT_MIN的宏定义可直接使用。

或者自行定义宏

#define INT_MAX 0x7fffffff

#define INT_MIN 0x80000000

INT_MAX = 2147483647

INT_MIN = -2147483648

这仅试用在没有限制范围的情况下使用。

否则同样会出现其他连锁的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: