当前位置:   article > 正文

代码随想录-二叉搜索树①

代码随想录-二叉搜索树①

目录

二叉搜索树的定义

700. 二叉搜索树中的搜索

题目描述:

输入输出示例:

思路和想法:

98. 验证二叉搜索树

题目描述:

输入输出示例:

 思路和想法:

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

题目描述:

输入输出示例:

思路和想法:

501.二叉搜索树中的众数

题目描述:

输入输出示例:

思路和想法:


二叉搜索树的定义

二叉搜索树,也称为二叉排序树,是一种特殊的二叉树。它的定义包括以下几点:

  1. 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。
  2. 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。
  3. 它的左右子树也分别是二叉搜索树

700. 二叉搜索树中的搜索

题目描述:

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

输入输出示例:

示例 1:

  1. 输入:root = [4,2,7,1,3], val = 2
  2. 输出:[2,1,3]

示例 2:

  1. 输入:root = [4,2,7,1,3], val = 5
  2. 输出:[]

提示:

  • 树中节点数在 [1, 5000] 范围内
  • 1 <= Node.val <= 107
  • root 是二叉搜索树
  • 1 <= val <= 107

思路和想法:

        利用二叉搜索树的特性进行查找。

  1. class Solution {
  2. public:
  3. TreeNode* searchBST(TreeNode* root, int val) {
  4. if (root == NULL || root->val == val) return root;
  5. TreeNode* result = NULL;
  6. if (root->val > val) result = searchBST(root->left, val);
  7. if (root->val < val) result = searchBST(root->right, val);
  8. return result;
  9. }
  10. };

98. 验证二叉搜索树

题目描述:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

输入输出示例:

示例 1:

  1. 输入:root = [2,1,3]
  2. 输出:true

示例 2:

  1. 输入:root = [5,1,4,null,null,3,6]
  2. 输出:false
  3. 解释:根节点的值是 5 ,但是右子节点的值是 4

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

 思路和想法:

  1. class Solution {
  2. public:
  3. long long maxvalue = LONG_MIN;
  4. bool isValidBST(TreeNode* root) {
  5. //二叉树遍历,看是否递增
  6. if(root == NULL) return true;
  7. bool left = isValidBST(root->left); //左
  8. if(root->val > maxvalue){ //中
  9. maxvalue = root->val;
  10. }else return false;
  11. bool right = isValidBST(root->right); //右
  12. return left && right;
  13. }
  14. };

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

题目描述:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

差值是一个正数,其数值等于两值之差的绝对值。

输入输出示例:

示例 1:

  1. 输入:root = [4,2,6,1,3]
  2. 输出:1

示例 2:

  1. 输入:root = [1,0,48,null,null,12,49]
  2. 输出:1

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

思路和想法:

  1. class Solution {
  2. public:
  3. int result = INT_MAX;
  4. TreeNode* pre = NULL;
  5. void traversal(TreeNode* cur){
  6. if(cur == NULL) return;
  7. traversal(cur->left); //左
  8. if(pre != NULL){ //中
  9. result = min(result, cur->val - pre->val);
  10. }
  11. pre = cur;
  12. traversal(cur->right);
  13. }
  14. int getMinimumDifference(TreeNode* root) {
  15. if(root == NULL) return 0;
  16. traversal(root);
  17. return result;
  18. }
  19. };

501.二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

输入输出示例:

示例 1:

  1. 输入:root = [1,null,2,2]
  2. 输出:[2]

示例 2:

  1. 输入:root = [0]
  2. 输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

思路和想法:

  1. class Solution {
  2. public:
  3. int maxcount = 1; //最大频率
  4. int count = 1; //统计次数
  5. TreeNode* pre = nullptr;
  6. vector<int> result; //存储结果
  7. void traversal(TreeNode* cur){
  8. if(cur == nullptr) return;
  9. traversal(cur->left);
  10. //刚开始遍历时,需要在result里放置元素
  11. if(pre == nullptr){
  12. count == 1;
  13. }
  14. else if(pre != nullptr){
  15. if(cur->val == pre->val){
  16. count ++;
  17. }else count = 1;
  18. }
  19. pre = cur;
  20. if(count > maxcount){
  21. maxcount = count;
  22. result.clear(); //数组清空
  23. result.push_back(cur->val);
  24. }
  25. else if(count == maxcount){
  26. result.push_back(cur->val);
  27. }
  28. traversal(cur->right);
  29. }
  30. vector<int> findMode(TreeNode* root) {
  31. if(root == nullptr) return result;
  32. traversal(root);
  33. return result;
  34. }
  35. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/779713
推荐阅读