总的链接 :
https://leetcode.cn/studyplan/top-interview-150/
二叉搜索树相关概念 :
二叉搜索树是一个有序树。
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树;
如下图所示 : 两颗都是搜索树
530 . 二叉搜索树的最小绝对差
. - 力扣(LeetCode)
本题与下题相同 :
. - 力扣(LeetCode)
递归1
根据二叉搜索树的特点 ,左 < 根 < 右 , 使用中序遍历可以得到一个包含所有结点值得从小到大得有序数组 ;
然后遍历这个得到得数组 , 依次更新ans = min (ans , res[i] - res[i-1]) ;即可 ;
class Solution {
public:
vector<int> res ;
void dfs(TreeNode* root){
if(root == nullptr) return ;
dfs(root->left) ;
res.push_back(root->val);
dfs(root->right);
}
int getMinimumDifference(TreeNode* root) {
int ans = INT_MAX ;
dfs(root) ;
for(int i=1;i<res.size();i++){
ans = min(ans , res[i] - res[i-1]);
}
return ans ;
}
};
递归2
其实在递归得过程中,可以借助一个pre结点表示当前结点得上一个结点,那么就不需要再创建一个数组来存了,直接在遍历得过程中,更新答案即可 ;
class Solution {
public:
int ans = INT_MAX ;
TreeNode* pre = nullptr ;
void dfs(TreeNode* root){
if(root == nullptr) return ;
dfs(root->left) ;
if(pre!=nullptr){
ans = min(ans , root->val - pre->val);
}
pre = root ;
dfs(root->right);
}
int getMinimumDifference(TreeNode* root) {
dfs(root) ;
return ans ;
}
};
230 . 二叉搜索树中第k小的元素
递归(中序遍历)
用中序遍历得到一个排好序的存放所有节点值的数组,然后输出第k个元素即可 ;
class Solution {
public:
vector<int> res ;
void dfs(TreeNode* root){
if(root == nullptr) return ;
dfs(root->left) ;
res.push_back(root->val);
dfs(root->right);
}
int kthSmallest(TreeNode* root, int k) {
dfs(root);
return res[k-1] ;
}
};
递归2 :
找到第k个,直接返回即可,不用存数组 ;
class Solution {
public:
int t = 0 ;
TreeNode* ans ;
void dfs(TreeNode* root,int k){
if(root == nullptr) return ;
dfs(root->left,k) ;
if(++t==k){
ans = root ;
return ;
}
dfs(root->right,k);
}
int kthSmallest(TreeNode* root, int k) {
dfs(root,k);
return ans->val;
}
};
98 . 验证二叉搜索树
用中序遍历得到结点值数组,判断该数组是否有序即可;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> vc;
void traversal(TreeNode* root){
if(!root) return;
traversal(root->left);
vc.push_back(root->val);
traversal(root->right);
}
bool isValidBST(TreeNode* root) {
vc.clear();
traversal(root);
for(int i=1;i<vc.size();i++){
if(vc[i] <= vc[i-1]) return false;
}
return true;
}
};
参考 :
二叉树基础知识总结-CSDN博客
二叉树遍历总结 -- 基于LeetCode-CSDN博客