【树】判断一棵树是不是BST

题目描述:https://leetcode-cn.com/problems/validate-binary-search-tree/

思路一:递归

  • 根据每一个结点键值的边界进行判断,如果不超出边界则合法,然后分别递归判断左右子树的结点
  • 宏LONG_MAX和LLONG_MAX均存在与头文件limits.h中,分别表示long int 和long long int类型的最大值。
  • 注意,BST中没有键值相等的结点
 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 isValidBST(TreeNode* root) {
13         return isValidBSTfun(root,LLONG_MIN,LLONG_MAX);     
14     }
15 
16     bool isValidBSTfun(TreeNode* root,long long min,long long max){
17         if(root==nullptr)
18             return true;
19         if(root->val<=min||root->val>=max)
20             return false;
21         return (isValidBSTfun(root->left,min,root->val)&&isValidBSTfun(root->right,root->val,max));
22     }
23 };

 

思路二:中序遍历

  • 因为对BST进行中序遍历就能得到键值递增的序列,所以只要中序遍历的时候后一个结点的键值比前一个结点的键值大就是BST
  • 不断的将当前结点node的键值与node前一个结点的键值pre比较,如果符合就更新pre=node->val.
  • 注意,pre要传地址过去,因为在函数体内要对pre的值修改,传值的话无法达到目的
 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 isValidBST(TreeNode* root) {
13         long long pre=LLONG_MIN;
14         return isValidBSTfun(root,pre);     
15     }
16 //node是当前结点,pre是左儿子的边界
17     bool isValidBSTfun(TreeNode* node,long long &pre){
18         if(node==nullptr)
19             return true;
20         if(isValidBSTfun(node->left,pre)){
21             if(node->val>pre){
22                 pre=node->val;
23                 return isValidBSTfun(node->right,pre);
24             }
25             else
26                 return false;
27         }
28         else
29             return false;
30     }
31 };

 

posted @ 2020-04-24 19:18  PennyXia  阅读(305)  评论(0编辑  收藏  举报