赞
踩
二叉搜索树操作,继续。
记录 五十六【501.二叉搜索树中的众数】
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
树中节点的数目在范围 [1, 10^4] 内
-10^5 <= Node.val <= 10^5
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
依然使用二叉搜索树中序遍历得到有序递增序列的特性。
/** * 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: void traversal(TreeNode* cur,vector<int>& nums){ if(!cur) return; traversal(cur->left,nums); nums.push_back(cur->val); traversal(cur->right,nums); return; } vector<int> findMode(TreeNode* root) { vector<int> result; vector<int> nums; traversal(root,nums); int max = 0; for(int i = 0;i < nums.size();){ int j=i+1; int count = 1; for(;j < nums.size();j++){ if(nums[j] == nums[i]){ count++; }else{ break; } } if(count > max){ if(!result.empty()) result.clear(); result.push_back(nums[i]); max = count; }else if(count == max){ result.push_back(nums[i]); } i = j; } return result; } };
学习目标:如何在树中边遍历边确定众数?肯定还是双指针。尝试一下:有bug
class Solution { public: int maxcount = 0;//记录最大次数 int count = 1;//计数。 TreeNode* pre = nullptr; void traversal(TreeNode* cur,vector<int>& nums){ if(!cur) return; traversal(cur->left,nums); if(pre && pre->val == cur->val){ count++; }else if(pre && pre->val != cur->val){ if(count > maxcount){ if(!nums.empty()) nums.clear(); nums.push_back(pre->val); maxcount = count;//最大值更新 }else if(count == maxcount){ nums.push_back(pre->val); } count = 1;//重新计数新的值 pre = cur;//此处才更新pre }else if(!pre){ pre = cur;//初始时,避免pre空 } traversal(cur->right,nums); return; } vector<int> findMode(TreeNode* root) { vector<int> result; traversal(root,result); //处理最后 } };
使用时候,如何结束时也能操作元素呢?在cur->right后还有处理逻辑。
class Solution { public: int maxcount = 0;//记录最大次数 int count = 1;//计数。 TreeNode* pre = nullptr; void traversal(TreeNode* cur,vector<int>& nums){ if(!cur) return; traversal(cur->left,nums); if(pre && pre->val == cur->val){ count++; }else if(pre && pre->val != cur->val ){ count = 1;//重新计数新的值 } pre = cur;//初始时,避免pre空 if(count > maxcount){ if(!nums.empty()) nums.clear(); nums.push_back(pre->val); maxcount = count;//最大值更新 }else if(count == maxcount){ nums.push_back(pre->val); } traversal(cur->right,nums); return; } vector<int> findMode(TreeNode* root) { vector<int> result; traversal(root,result); return result; } };
/** * 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: void traversal(TreeNode* cur,unordered_map<int,int>& nums){ if(!cur) return; nums[cur->val]++; traversal(cur->left); traversal(cur->right); } bool cmp(const pair<int,int>& a,const pair<int,int>& b) const{ return a.second > b.second; } vector<int> findMode(TreeNode* root) { vector<int> result; unordered_map<int,int> map; traversal(root,map); vector<pair<int,int>> vec(map.begin(),map.end()); sort(vec.begin(),vec.end(),cmp); result.push_back(vec[0].first); for(int i = 0;i <vec.size();i++){ if(vec[i].second == vec[0].second) result.push_back(vec[i].first); } return result; } };
【501.二叉搜索树中的众数】和【求普通二叉树的众数】
(欢迎指正,转载标明出处)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。