当前位置:   article > 正文

刷题打卡day 21 : 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

刷题打卡day 21 : 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

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

  1. class Solution {
  2. private:
  3. int result = INT_MAX;//设置result记录两值之差绝对值最小值,首先设置成INT_MAX
  4. TreeNode* pre = NULL;
  5. void traversal(TreeNode* cur) {
  6. if (cur == NULL) return;
  7. traversal(cur->left); // 左
  8. //双指针法,当pre != NULL才可以进行操作,不能操作空指针
  9. //第一轮循环pre = NULL,不进入result的比较。
  10. if (pre != NULL){ // 中
  11. result = min(result, cur->val - pre->val);
  12. }
  13. pre = cur; // 记录前一个,上面比较完了,现在pre一直指向cur的前一个节点,搜索树相邻指针就这么写
  14. traversal(cur->right); // 右
  15. }
  16. public:
  17. int getMinimumDifference(TreeNode* root) {
  18. traversal(root);
  19. return result;
  20. }
  21. };

501.二叉搜索树中的众数

  1. class Solution {
  2. private:
  3. int maxCount = 0; // 记录最大频率
  4. int count = 0; // 记录统计频率
  5. TreeNode* pre = NULL;//双指针法,记录前一个指针
  6. vector<int> result;//结果数组
  7. void searchBST(TreeNode* cur) {
  8. if (cur == NULL) return ;
  9. //搜索树,中序遍历。左中右
  10. searchBST(cur->left); // 左
  11. // 中
  12. if (pre == NULL) { // 第一个节点
  13. count = 1;
  14. } else if (pre->val == cur->val) { // 与前一个节点数值相同
  15. count++;
  16. } else { // 与前一个节点数值不同
  17. count = 1;
  18. }
  19. pre = cur; // 更新上一个节点,搜索树双指针法标准记录前一个节点的方法
  20. if (count == maxCount) { // 如果和最大值相同,放进result中
  21. result.push_back(cur->val);
  22. }
  23. if (count > maxCount) { // 如果计数大于最大值频率
  24. maxCount = count; // 更新最大频率
  25. result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
  26. result.push_back(cur->val);
  27. }
  28. searchBST(cur->right); // 右
  29. return ;
  30. }
  31. public:
  32. vector<int> findMode(TreeNode* root) {
  33. count = 0;
  34. maxCount = 0;
  35. TreeNode* pre = NULL; // 记录前一个节点
  36. result.clear();
  37. searchBST(root);
  38. return result;
  39. }
  40. };

236. 二叉树的最近公共祖先  

没有目标值就返回空?

中要根据左右节点的结果来判断。后序递归,然后才有中的逻辑。

通过回溯逐渐向上返回

  1. class Solution {
  2. public:
  3. TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
  4. //终止条件
  5. //遇到空的话,因为树都是空了,所以返回空。
  6. //那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,
  7. //这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面写
  8. if (root == q || root == p || root == NULL) return root;
  9. //左右都要用值接住,递归函数是有返回值的
  10. TreeNode* left = lowestCommonAncestor(root->left, p, q);//左
  11. TreeNode* right = lowestCommonAncestor(root->right, p, q);//右
  12. //中:中要根据左右节点的结果来判断。后序递归,然后才有中的逻辑。
  13. //通过回溯逐渐向上返回
  14. if (left != NULL && right != NULL) return root;//说明下面有pq,说明现在的root就是
  15. if (left == NULL && right != NULL) return right;//右不为空,说明右面有p或者q
  16. else if (left != NULL && right == NULL) return left;//同上,左面有
  17. else { // (left == NULL && right == NULL)
  18. return NULL;//都没有,返回null
  19. }
  20. }
  21. };

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

闽ICP备14008679号