leetcode-98 Validate Binary Search Tree

来源:互联网 发布:mac os x 10.7 .2 iso 编辑:程序博客网 时间:2024/05/24 04:47

思路: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

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

否则同样会出现其他连锁的错误。




0 0
原创粉丝点击