树验证二叉搜索树

Posted ocpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树验证二叉搜索树相关的知识,希望对你有一定的参考价值。

题目:

技术图片

 

 

解法:

方法一:

技术图片

 

 下面是brute force code,虽然不是很高效,但是可以工作。

 1 bool isSubTreeLessThan(BinaryTree *p, int val)
 2 {
 3     if (!p)
 4     {
 5         return true;
 6     }
 7     return (p->data < val && isSubTreeLessThan(p->left, val) && isSubTreeLessThan(p->right, val));
 8 }
 9 
10 bool isSubTreeGreaterThan(BinaryTree *p, int val)
11 {
12     if (!p)
13     {
14         return true;
15     }
16     return (p->data > val && isSubTreeGreaterThan(p->left, val) && isSubTreeGreaterThan(p->right, val));
17 }
18 
19 bool isBSTBruteForce(BinaryTree *p)
20 {
21     if (!p)
22     {
23         return true;
24     }
25     return isSubTreeLessThan(p->left, p->data) && isSubTreeGreaterThan(p->right, p->data)
26         && isBSTBruteForce(p->left) && isBSTBruteForce(p->right);
27 }

 

 

方法二:

技术图片

 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 class Solution {
11 public:
12     bool isBSTHelper(TreeNode *p, int low, int high)
13     {
14         if (p == NULL)
15         {
16             return true;
17         }
18         if (low < p->val && p->val < high)
19         {
20             return isBSTHelper(p->left, low, p->val) && isBSTHelper(p->right, p->val, high);
21         }
22         else
23         {
24             return false;
25         }
26     }
27 
28     bool isValidBST(TreeNode *root)
29     {
30         // INT_MIN and INT_MAX are defined in C++‘s <climits> library
31         return isBSTHelper(root, INT_MIN, INT_MAX);
32     }
33 };

 

方法三:

技术图片

 

 

 1 //小集合和大集合均OK
 2 class Solution
 3 {
 4 public:
 5     bool isBSTInOrderHelper(TreeNode *p, int& prev)
 6     {
 7         if(p == NULL)
 8         {
 9             return true;
10         }
11 
12         if(isBSTInOrderHelper(p->left, prev))
13         {
14             if(prev < p->val)
15             {
16                 prev = p->val;
17 
18                 return isBSTInOrderHelper(p->right, prev);
19             }
20             else
21             {
22                 return false;
23             }
24         }
25         else
26         {
27             return false;
28         }
29     }
30     
31     bool isBSTInOrder(TreeNode *root)
32     {
33         int prev = INT_MIN;
34         return isBSTInOrderHelper(root, prev);
35     }
36 
37     //main
38     bool isValidBST(TreeNode *root)
39     {
40         if(root == NULL)
41         {
42             return true;
43         }
44         else
45         {
46             return isBSTInOrder(root);
47         }
48     }
49 };

 

以上是关于树验证二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

java刷题-98验证二叉搜索树

二叉树:我是不是一棵二叉搜索树

二叉树系列验证二叉搜索树&二叉搜索树的最小绝对差&二叉搜索树中的众数&二叉树的最近公共祖先

LeetCode第九十八题—验证二叉搜索树—Python实现

代码题(10)— 二叉搜索树

力扣每日一题——NO.98——验证二叉搜索树