前言
上一题弄明白二叉搜索树的概念,这题做起来就相对简单一些了。
题目
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。
数据范围:节点数量满足
1
≤
n
≤
1
0
4
1≤n≤10^4
1≤n≤104 ,节点上的值满足
−
2
31
≤
v
a
l
≤
2
31
−
1
−2^{31}≤val≤2^{31}−1
−231≤val≤231−1
解决方案一
1.1 思路阐述
二叉搜索树的特性就是中序遍历是递增序。既然是判断是否是二叉搜索树,那我们可以使用中序递归遍历。只要之前的节点是二叉树搜索树,那么如果当前的节点小于上一个节点值那么就可以向下判断。*只不过在过程中我们要求反退出。比如一个链表1->2->3->4,只要for循环遍历如果中间有不是递增的直接返回false即可。
首先递归到最左,初始化maxLeft与pre。然后往后遍历整棵树,依次连接pre与当前节点,并更新pre。
左子树如果不是二叉搜索树返回false。判断当前节点是不是小于前置节点,更新前置节点。最后由右子树的后面节点决定
1.2 源码
class Solution {
public:
long pre = INT_MIN;
//中序遍历
bool isValidBST(TreeNode* root) {
if(!root)
return true;
//先进入左子树
if(!isValidBST(root->left))
return false;
if(root->val <= pre)
return false;
//更新最值
pre = root->val;
//再进入右子树
if(!isValidBST(root->right))
return false;
return true;
}
};
解决方案二
2.1 思路阐述
还可以用栈代替递归
2.2 源码
class Solution {
public:
bool isValidBST(TreeNode* root) {
//设置栈用于遍历
stack<TreeNode*> s;
TreeNode* head = root;
vector<int> sort; //记录中序遍历的数组
while(head != NULL || !s.empty()){
//直到没有左节点
while(head != NULL){
s.push(head);
head = head->left;
}
head = s.top();
s.pop();
//访问节点
sort.push_back(head->val);
head = head->right;
}
//遍历中序结果
for(int i = 1; i < sort.size(); i++){
//一旦有降序,则不是搜索树
if(sort[i - 1] > sort[i])
return false;
}
return true;
}
};
总结
二叉搜索树:中序遍历。
二叉树:递归或者栈。