文章目录
一、98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool searchBST(TreeNode *root, long long low, long long high){
if (root == nullptr){
return true;
}
if (root->val <= low || root->val >= high){
return false;
}
return searchBST(root->left, low, root->val) && searchBST(root->right, root->val, high);
}
bool isValidBST(TreeNode* root) {
//很明显也是一道递归题目
return searchBST(root, LONG_MIN, LONG_MAX);
}
};
二、653. 两数之和 IV - 输入 BST
要知道二叉搜索树的中序遍历是升序,将遍历输出存为数组
再使用首位两个指针队目标值进行搜索
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
//这题和二叉搜索树有什么关系,关键应该是二叉搜索树的中序遍历是升序排列的
vector<int> q;
InOrder(root, q);
int j = q.size() - 1;
int i = 0;
while (i < j){
int sum = q[i] + q[j];
if (sum == k){
return true;
}
if (sum < k){
i++;
}
else {
j--;
}
}
return false;
}
void InOrder(TreeNode* root, vector<int> &q){
if (root == nullptr){
return;
}
InOrder(root->left, q);
q.push_back(root->val);
InOrder(root->right, q);
}
};
三、235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//因为二叉搜索树是左子树小于右子树,
while(1){
if (root->val < p->val && root->val < q->val){
root = root->right;
}
if (root->val > p->val && root->val > q->val){
root = root->left;
}
else{
break;
}
}
return root;
}
};