题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
class Solution
{
private:
vector<int> nums;
void traversal(TreeNode *root,vector<int> &nums)
{
if(root==nullptr) return;
traversal(root->left,nums);
nums.push_back(root->val);
traversal(root->right,nums);
}
public:
int getMinimumDifference(TreeNode *root)
{
traversal(root,nums);
int m=INT_MAX;
for(int i=0;i<nums.size()-1;i++){
m=min(nums[i+1]-nums[i],m);
}
return m;
}
};
有了昨天的经验,知道二叉搜索树中序遍历得出的是一个升序数组。利用这个数组进行操作就行了。
题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)
class Solution
{
public:
unordered_map<int,int> map;
void traversal(TreeNode *root)
{
if(root==nullptr) return;
traversal(root->left);
map[root->val]++;
traversal(root->right);
}
bool static cmp(const pair<int,int> &a,const pair<int,int> &b)
{
return a.second>b.second;
}
vector<int> findMode(TreeNode *root)
{
traversal(root);
vector<pair<int,int>> mapNums(map.begin(),map.end());
sort(mapNums.begin(),mapNums.end(),cmp);
vector<int> result;
result.push_back(mapNums[0].first);
for(int i=1;i<mapNums.size();i++){
if(mapNums[0].second==mapNums[i].second) result.push_back(mapNums[i].first);
}
return result;
}
};
之前有用到过这种方法。
用map记录出现次数,把map赋给一个pair向量。
重写sort的比较方法cmp,然后对vector<pair<int,int>>进行排序。
题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)
class Solution
{
public:
TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
{
if (root == p || root == q || root == nullptr)
return root;
TreeNode *left = lowestCommonAncestor(root->left, p, q);
TreeNode *right = lowestCommonAncestor(root->right, p, q);
if(left&&right) return root;
else if(left&&!right) return left;
else if(!left&&right) return right;
else return nullptr;
}
};
这道题可以说很考验递归的思维能力。
最终返回的有两种可能,一种是最终left和right指针都不为空,这时候就说明找到了p和q,然后就可以返回这个结点root,这个结点就是最近公共祖先结点。然后一层层回溯上去,在函数开始的if判断条件就可以一直把root返回出去。
第二种是p和q都在left或都在right这边,那么这就说明,必定有一个结点是另一个的祖先节点,那么,我们返回这个节点就行了。然后可以通过第二个if的else if语句一直把left或right返回上去。
很复杂的过程,但是细想后会发现设计的很精妙。