观察可以发现,只要进行一遍中序遍历就可以解决,主要的难点是要保存上一个节点的值与下一个节点进行比较,这可以设置一个全局变量,把它作为前一节点值,每次中序都可以让当前节点值和它进行比较,如果违反顺序规则,则直接return退出,这里又可以设置一个flag来帮助我们剪枝。
LeetCode测试用例有一个是int类型的最小值 [-2147483648] ,这让我的初始节点值设置的不够小,查了一下资料可以用long long类型的LONG_MIN
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 11 //保存前一个节点的值 12 class Solution { 13 public: 14 long long pre=LONG_MIN; //卡边界(真的恶心) 15 bool flag=true; 16 bool isValidBST(TreeNode* root) { 17 if(!root||!flag) return 1; //剪枝 18 isValidBST(root->left); 19 if(root->val<=pre){ 20 flag=false; 21 return 0; 22 } 23 else pre=root->val; 24 isValidBST(root->right); 25 return flag; 26 } 27 };