一、题目介绍
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/legal-binary-search-tree-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
二叉搜索树的特点,中序遍历可以得到一组升序序列,即先遍历到的节点要小于后遍历到的节点。本题考查二叉树的中序遍历。
三、解题代码
1、递归方法
class Solution {
private:
long val;
bool flag;
public:
//二叉搜索树的特点:中序遍历时为有序的
bool isValidBST(TreeNode* root) {
val = LONG_MIN;
flag = true;
dfs(root);
return flag;
}
void dfs(TreeNode* root)
{
if(!root || !flag)
{
return;
}
dfs(root->left);
if(root->val > val)
{
val = root->val;
}
else
{
flag = false;
return;
}
dfs(root->right);
}
};
2、非递归法
class Solution {
public:
//二叉搜索树的特点:中序遍历时为有序的,即后遍历到的节点大于先遍历到的节点
bool isValidBST(TreeNode* root) {
if(!root)
return true;
stack<TreeNode*> st;
TreeNode* pNode = NULL;
while(!st.empty() || root)
{
while(root)
{
st.push(root);
root = root->left;
}
root = st.top();
st.pop();
if(pNode && pNode->val >= root->val)
return false;
pNode= root;
root = root->right;
}
return true;
}
};