当前位置:   article > 正文

lc501.二叉搜索树中的众数【线索二叉树Morris遍历->lc538】_lc538a

lc538a

开始想的按普通二叉树一样,把值和计数放在一个数组里面,但是想想它是二叉搜索树,有什么特别的呢?

官方题解https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/er-cha-sou-suo-shu-zhong-de-zhong-shu-by-leetcode-/ 

1)先中序遍历得到顺序数组,然后遍历数组并计数。

2)*****Morris遍历(中序),使用跟lc538反序中序遍历一样的方法,一边建立线索,一边中序遍历,一边计数

【注意点】1.最开始写的fun(node->val,num),num是值传递,就没有更新num的值,结果就错了;2.最开始忘记了&&pre->right!=node。记得如果是第二次找前驱,最终不会遇到NULL,而会遇到node自己。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. vector<int> re;
  13. int maxcount=0,count=0,num=0;
  14. vector<int> findMode(TreeNode* root) {
  15. TreeNode* node=root;
  16. while(node){
  17. if(!node->left){ //无左子树,访问node,去往node->right
  18. fun(node->val); //最开始写的fun(node->val,num),num是值传递,就没有更新num的值,结果就错了
  19. node=node->right;
  20. }else{ //左子树存在,找前驱
  21. TreeNode* pre=FindPre(node);
  22. if(!pre->right){ //如果没有线索,建立线索,然后node继续遍历
  23. pre->right=node;
  24. node=node->left;
  25. }else{ //如果已经建立线索,则访问node,去往node->right
  26. pre->right=NULL;
  27. fun(node->val);
  28. node=node->right;
  29. }
  30. }
  31. }
  32. return re;
  33. }
  34. void fun(int val){
  35. if(val==num){ //结点值不变
  36. count++;
  37. }else{ //结点值改变
  38. count=1; //重新计数
  39. num=val;
  40. }
  41. if(count>maxcount){ //计数变大
  42. maxcount=count; //更新maxcount
  43. re=vector<int> {num};
  44. }else if(count==maxcount){ //计数同最大,val加入re
  45. re.push_back(val);
  46. }//计数未达到最大,直接重新计数
  47. }
  48. TreeNode* FindPre(TreeNode* node){
  49. TreeNode* pre=node->left;
  50. while(pre->right&&pre->right!=node) //最开始忘记了&&pre->right!=node。记得如果是第二次找前驱,最终不会遇到NULL,而会遇到node自己
  51. pre=pre->right;
  52. return pre;
  53. }
  54. };

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/429938
推荐阅读
相关标签
  

闽ICP备14008679号