530.二叉搜索树的最小绝对差
题目链接:二叉搜索树的最小绝对差
题目描述:
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
解题思路:
- 本题跟昨天的验证二叉搜索树是一样的套路。抓住二叉搜索树的中序遍历是单调递增的这一点。我们只要比较每个邻近的差值就好。
- 本题采用递归算法,通过中序遍历左中右的顺序,记下最小绝对差,最后返回最小值就行。
class Solution {
public:
TreeNode* pre=NULL;
int minValue=INT_MAX;
int getMinimumDifference(TreeNode* root) {
traversal(root);
return minValue;
}
void traversal(TreeNode* root)
{
if(root==NULL) return;
traversal(root->left);
if(pre!=NULL)
{
minValue=min(root->val-pre->val,minValue);
}
pre=root;
traversal(root->right);
return ;
}
};
501.二叉搜索树中的众数
题目链接:二叉搜索树中的众数
题目描述:
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
解题思路:
- 本题同样跟上一题一样,采用迭代的中序遍历,在本题中,由于需要返回多个,而不是唯一个,因此当出现更多的数字时,我们需要及时的清空的数组,再将该数字加入数组中。
- 本题中,将相关的定义为类的属性了,而不是函数的形参,当然也可以直接定义在函数中,然后在形参中引用即可。
class Solution {
public:
int count=0;
int MaxCount=0;
TreeNode* pre=NULL;
vector<int>result;
vector<int> findMode(TreeNode* root) {
traversal(root);
return result;
}
void traversal(TreeNode* root)
{
if(root==NULL) return ;
traversal(root->left);
if(pre==NULL) count=1;
else if(pre->val==root->val) count++;
else count=1;
pre=root;
if(count==MaxCount){
result.push_back(root->val);
}
if(count>MaxCount)
{
result.clear();
result.push_back(root->val);
MaxCount=count;
}
traversal(root->right);
}
};
236 二叉树的最近公共祖先
题目链接:二叉树的最近公共祖先
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路:
- 本题采用递归的做法。在做该题时,首先明确递归三部曲。1. 确定返回值和参数,2.确定终止条件,3,确定单层逻辑
- 确定返回值和参数:在本题中,返回值按理来说,应该是true或者false,表明该点是否是其中一个点的祖先,但还需要最近的公共祖先,因此,返回值就是TreeNode了,同时参数列表很容易得到,就是给定的函数的参数列表。
- 确定终止条件。终止条件,便是到达了叶子节点,或者已经该节点是题目中给定的p或者q,
- 确定单层逻辑。首先明确的是,存在着两种情况,一种是pq在根节点的两侧,此时,就如同下面中代码注释的一样,通过遍历左右子树,当两个不为空的时候,即该root就是两个pq的最近公共祖先。第二种情况就是,q和p在一侧,或者说,q或者p就是其公共祖先,另一个节点是其子树,此时,在终止条件时,直接返回该节点了,其子树不在遍历,也符合相应的要求。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(p==root||q==root||root==NULL) return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);//在目前的层次下,找到了左节点,说明该节点是其中一个的父节点
TreeNode* right=lowestCommonAncestor(root->right,p,q);//在目前的层次下,找到了右节点,说明该节点是其中一个的父节点
if(left!=NULL&&right!=NULL) return root;//当两个都不为空,则表明该节点肯定是最近的公共祖先
if(left==NULL&&right!=NULL) return right;//不断向上传递
else if(left!=NULL&&right==NULL) return left;
else return NULL;
}
};