首页 > 代码库 > 【leetcode】Validate Binary Search Tree

【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 };

 

【leetcode】Validate Binary Search Tree