二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数

Posted 归宅观察部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数相关的知识,希望对你有一定的参考价值。


530. 二叉搜索树的最小绝对差

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/
这也是一道easy题,主要是考察对于二叉搜索树的认识,这个认识也很简单,就是二叉搜索树的最小绝对差一定是存在于二叉搜索树的中序遍历的有序数组的任意两个相邻的数字中。即,通过中序遍历,按顺序比较前后两个元素并更新最小绝对差即可。

上代码。
class Solution {public: void traversal(TreeNode* cur,vector<int> &vec){ if(cur==NULL){ return; } traversal(cur->left,vec); vec.push_back(cur->val); traversal(cur->right,vec); } int getMinimumDifference(TreeNode* root) { vector<int> ans; traversal(root,ans); int maxDiff=INT_MAX; for(int i=1;i<ans.size();i++){ maxDiff=min(maxDiff,ans[i]-ans[i-1]); } return maxDiff; }};

        这里使用了先生成数组,然后比较的方法,没有引入pre节点边遍历边比较,在这题中这样的方法应该是更加简单的。

        然而看下一道题,不引入pre节点就会麻烦一些。


501. 二叉搜索树中的众数

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值 左子树和右子树都是二叉搜索树 例如:给定 BST [1,null,2,2],

   

    2 

  / 

返回[2].

https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/

        思路与上一道题是相似的,先看一下我的错误代码吧,错误太多以至于懒得改了……

class Solution {public: void traversal(TreeNode* cur,int& maxCount,int& count,vector<int>& ans){ if(cur==NULL) return; traversal(cur->left,count,maxCount,ans); if(ans.empty()) { ans.push_back(cur->val); count=1; } if(cur->val!=ans.back()){ count=1; if(count==maxCount){ ans.push_back(cur->val); } } else{ count++; if(count==maxCount) ans.push_back(cur->val); if(count>maxCount) { ans.clear(); ans.push_back(cur->val); } maxCount=max(count,maxCount); } traversal(cur->right,count,maxCount,ans); } vector<int> findMode(TreeNode* root) { int maxCount=0; int count=0; vector<int> ans; traversal(root,maxCount,count,ans); return ans; }};

这里的问题主要是两点:

1.maxcount和count、ans完全可以变成private成员,免去了每次传参的问题。

2.使用pre与cur进行比较,而不是ans.back()与cur->val比较,因为后者很难处理第一个节点的情况,而前者可以认为pre为NULL时是第一个节点,直接初始化count即可。

直接上参考代码:
class Solution {private: int maxCount; // 最大频率 int count; // 统计频率 TreeNode* pre; vector<int> result; void searchBST(TreeNode* cur) { if (cur == NULL) return ;
searchBST(cur->left); // 左 // 中 if (pre == NULL) { // 第一个节点 count = 1; } else if (pre->val == cur->val) { // 与前一个节点数值相同 count++; } else { // 与前一个节点数值不同 count = 1; } pre = cur; // 更新上一个节点
if (count == maxCount) { // 如果和最大值相同,放进result中 result.push_back(cur->val); }
if (count > maxCount) { // 如果计数大于最大值频率 maxCount = count; // 更新最大频率 result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了 result.push_back(cur->val); }
searchBST(cur->right); // 右 return ; }
public: vector<int> findMode(TreeNode* root) { count = 0; maxCount = 0; TreeNode* pre = NULL; // 记录前一个节点 result.clear();
searchBST(root); return result; }};//代码来自公众号代码随想录 作者为Carl
今天的题就做到这里吧()。 二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数

王二狗啊王二狗!你怎么能如此堕落!先前订下的学习计划你都忘了吗?

正月初二,打牌。


以上是关于二叉树刷题篇(11) 二叉搜索树的最小绝对差与众数的主要内容,如果未能解决你的问题,请参考以下文章

二叉树刷题篇平衡二叉树与二叉树的所有路径

二叉树刷题篇 完全二叉树的节点个数

二叉树刷题篇

二叉树刷题篇(10) 二叉搜索树

二叉树刷题篇 最大二叉树 and 合并二叉树

二叉树刷题篇(咕)