【树】判断一棵树是不是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 };
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。