Leetcode530——二叉搜索树的最小绝对差
题目描述:
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
算法思想:
利用二叉搜索树中序遍历是个升序数组的特性,记录下升序遍历中前后两个节点差的最小值。
算法实现:
TreeNode *pre=nullptr;
int mindif=INT_MAX;
void travel(TreeNode* node){
if(node==nullptr) return;
travel(node->left);
if(pre) mindif=min(mindif,node->val-pre->val);
pre=node;
travel(node->right);
return;
}
int getMinimumDifference(TreeNode* root) {
travel(root);
return mindif;
}
Leetcode501——二叉搜索树中的众数
题目描述:
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
算法思想:
遍历出所有的节点并保存到图中,图记录所有关键字出现的频率。最后在图中找到频率最大的加入到结果集中。(笨方法,并没有利用到二叉搜索树的特性,适用于随便一棵二叉树)
算法实现:
unordered_map<int,int> mulmap;
void intraverse(TreeNode* root){
if(root==nullptr) return;
intraverse(root->left);
mulmap[root->val]++;
intraverse(root->right);
}
vector<int> findMode(TreeNode* root) {
vector<int> res;
intraverse(root);
int maxnode=0;
for(auto it:mulmap){
if(maxnode<it.second){
res.clear();
maxnode=it.second;
res.push_back(it.first);
}else if(maxnode==it.second){
res.push_back(it.first);
}
}
return res;
}
Leetcode236——二叉树的最近公共祖先
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点5
和节点1
的最近公共祖先是节点3 。
算法思想:
利用后序遍历的思想,遍历到目标节点直接向父节点返回状态,当某个父节点接收到两个目标节点的信息保存该节点不断向上返回。
算法实现:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || root==p || root==q) return root;
TreeNode* ltree=lowestCommonAncestor(root->left,p,q);
TreeNode* rtree=lowestCommonAncestor(root->right,p,q);
if(ltree && rtree) return root;
else if(!ltree && rtree) return rtree;
else if(ltree && !rtree) return ltree;
else return NULL;
}
Leetcode235——二叉搜索树的最近公共祖先
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点2
和节点8
的最近公共祖先是6。
算法思想:
利用二叉搜索树的特性,当当前遍历的父亲节点值大于两个目标节点时,公共祖先一定在左子树中;当当当前遍历的父亲节点值小于两个目标节点时,公共祖先节点一定在右子树中;当当前遍历的父亲节点值处于两个目标节点之间时,该节点就为公共祖先节点。(可画图感受魅力)
算法实现:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return NULL;
if(root->val>p->val && root->val>q->val){
TreeNode* ltree=lowestCommonAncestor(root->left,p,q);
if(ltree) return ltree;
}else if(root->val<p->val && root->val<q->val){
TreeNode *rtree=lowestCommonAncestor(root->right,p,q);
if(rtree) return rtree;
}
return root;
}