目录
一、530. 二叉搜索树的最小绝对差
题目链接:力扣
文章讲解:代码随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差
题目:
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
代码:
/**
* 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:
TreeNode* pre = NULL;
void dfs(int &result, TreeNode* root){
if(root->left) dfs(result, root->left);
if(pre) result = min(abs(root->val-pre->val), result);
pre = root;
if(root->right) dfs(result, root->right);
return;
}
int getMinimumDifference(TreeNode* root) {
int result = INT_MAX;
dfs(result, root);
return result;
}
/*stack<TreeNode*> st;
TreeNode *pre = NULL;
int ans = INT_MAX;
while (root || !st.empty())
{
if (root)
{
st.push(root);
root = root->left;
}
else
{
root = st.top();
st.pop();
if (pre)
ans = min(ans, root->val - pre->val);
pre = root;
root = root->right;
}
}*/
return ans;
}
};
时间复杂度: O(n) 空间复杂度: O(n)
⏲:2:49
总结:1.中序遍历相当于数组,遇到在二叉搜索树上求最值、差值,可以考虑二叉树中序遍历的有序性。2.前,后指针的运用,pre的第一个值(一般为NULL)和更新值。
二、501. 二叉搜索树中的众数
题目链接:力扣
文章讲解:代码随想录
视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数
题目:给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义: 结点左子树中所含节点的值 小于等于 当前节点的值 结点右子树中所含节点的值 大于等于 当前节点的值 左子树和右子树都是二叉搜索树
代码:
/**
* 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:
TreeNode* pre = NULL;
void dfs(vector<int> &result, TreeNode* root, int &count, int &max){
if(root->left) dfs(result, root->left, count, max);
if(pre && pre->val == root->val) count++;
else count = 1;
if(count >= max) {
if(count > max) result.clear();
max = count;
result.push_back(root->val);
}
pre = root;
if(root->right) dfs(result, root->right, count, max);
return;
}
vector<int> findMode(TreeNode* root) {
vector<int> result;
int count = 1;
int max = 0;
if (root) dfs(result, root, count, max);
return result;
}
};
时间复杂度: O(n) 空间复杂度: O(n)
⏲:7:37
总结:1.普通二叉树的高频众数,要用map。2.二叉搜索树的众数,可用数组的clear来避免二次遍历。
三、236. 二叉树的最近公共祖先
题目链接:力扣
文章讲解:代码随想录
视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p ,q);
TreeNode* right = lowestCommonAncestor(root->right, p ,q);
if(left && right) return root;
if(left) return left;
else return right;
}
};
时间复杂度: O(n) 空间复杂度: O(n)
⏲:9:19
总结:自下而上——回溯——二叉树的后序遍历。