【leetcode】Validate Binary Search Tree
Validate Binary Search Tree
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.
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
思路一:利用递归的思想,任何一个节点必须要在min和max范围内
min和max根据是左子树还是右子树来确定
如果是左子树:
node->left<node
如果是右子树:
node->right>node
递归条件:node->val在min和max范围内,node->left要在min,node->val范围内,node->right要在node->val,max范围内
node->val<max&&node->val>min&&testValid(node->left,node->val,min)&&testValid(node->right,max,node->val);
1 /** 2 * Definition for binary tree 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 class Solution { 11 public: 12 bool isValidBST(TreeNode *root) { 13 14 if(root==NULL) 15 { 16 return true; 17 } 18 19 if(root->left==NULL&&root->right==NULL) 20 { 21 return true; 22 } 23 24 //注意如果测试用例含有INT_MAX则,必须采用long long int 才能避免出错 25 return testValid(root,(long long int)INT_MAX+1,(long long int)INT_MIN-1); 26 } 27 28 29 bool testValid(TreeNode *node,long long int max, long long int min) 30 { 31 if(node==NULL) 32 { 33 return true; 34 } 35 36 37 return node->val<max&&node->val>min&&testValid(node->left,node->val,min)&&testValid(node->right,max,node->val); 38 39 } 40 };
第二种方法,利用 二叉排序树 中序遍历 结果为递增序列的性质
1 /** 2 * Definition for binary tree 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 class Solution { 11 public: 12 vector<int> ret_v; 13 bool isValidBST(TreeNode *root) { 14 15 if(root==NULL) 16 { 17 return true; 18 } 19 20 ret_v.clear(); 21 inOrderTraversal(root); 22 23 //判断是否递增 24 for(int i=0;i<ret_v.size()-1;i++) 25 { 26 if(ret_v[i]>=ret_v[i+1]) 27 { 28 return false; 29 } 30 } 31 return true; 32 } 33 34 //中序遍历,记录下数值 35 void inOrderTraversal(TreeNode *root) 36 { 37 if(root==NULL) 38 { 39 return; 40 } 41 42 inOrderTraversal(root->left); 43 ret_v.push_back(root->val); 44 inOrderTraversal(root->right); 45 } 46 };
第三种:直接在中序遍历中判断:
1 /** 2 * Definition for binary tree 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 class Solution { 11 public: 12 13 int ret; 14 bool flag; 15 bool isFirstNode; 16 17 bool isValidBST(TreeNode *root) { 18 19 flag=true; 20 //判断是不是第一个被访问的节点 21 isFirstNode=true; 22 23 inOrderTraversal(root); 24 return flag; 25 } 26 27 void inOrderTraversal(TreeNode *root) 28 { 29 if(root==NULL) 30 { 31 return; 32 } 33 34 if(!flag) 35 { 36 return; 37 } 38 39 inOrderTraversal(root->left); 40 41 //一旦发现不符合升序,则不是二叉排序树 42 if(!isFirstNode&&ret>=root->val) 43 { 44 flag=false; 45 return; 46 } 47 48 ret=root->val; 49 isFirstNode=false; 50 51 inOrderTraversal(root->right); 52 } 53 54 55 };