二叉搜索树定义:
- 节点左子树只包含小于当前节点的数;
- 节点右子树只包含大于当前节点的数;
- 所有左子树和右子树自身必须也是二叉搜索树。
实际上,若中序遍历二叉搜索树,所得序列是单调递增的,利用这一性质来判断是否是二叉搜索树。
递归法
创建一个指针pre
,指向中序遍历过程中的当前节点的上一个节点,比较pre->val
和root->val
的大小即可。
class Solution {
public:
TreeNode *pre = nullptr; // 用来记录前一个节点
bool isValidBST(TreeNode *root) {
if (root == nullptr)
return true;
bool left = isValidBST(root->left);
if (pre != nullptr && pre->val >= root->val)
return false;
pre = root; // 记录前一个节点
bool right = isValidBST(root->right);
return left && right;
}
};
迭代法
主要是复习一下中序遍历的迭代写法
#include <stack>
using std::stack;
class Solution {
public:
bool isValidBST(TreeNode *root) {
TreeNode *pre = nullptr; // 用来记录前一个节点
TreeNode *cur = root;
stack<TreeNode *> stk;
if (root == nullptr)
return true;
stk.push(cur);
while (cur != nullptr || !stk.empty()) {
if (cur != nullptr) {
stk.push(cur);
cur = cur->left;
} else {
cur = stk.top();
stk.pop();
if (pre != nullptr && pre->val >= cur->val)
return false;
pre = cur;
cur = cur->right;
}
}
}
};
标签:pre,binary,search,cur,nullptr,tree,stk,root,节点
From: https://www.cnblogs.com/zwyyy456/p/16661653.html