博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c/c++ leetcode 938. 二叉搜索树的范围和
阅读量:3964 次
发布时间:2019-05-24

本文共 2366 字,大约阅读时间需要 7 分钟。

题目描述

难度简单127

给定二叉搜索树的根结点 root,返回 LR(含)之间的所有结点的值的和。

二叉搜索树保证具有唯一的值。

示例 1:

输入:root = [10,5,15,3,7,null,18], L = 7, R = 15输出:32

示例 2:

输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10输出:23

提示:

  1. 树中的结点数量最多为 10000 个。

  2. 最终的答案保证小于 2^31

    注: 一定要先看清题目,要求出在这颗树中节点数据比L大于等于并且小于等于R值的和;

解法一:递归

原链接:https://leetcode-cn.com/problems/range-sum-of-bst/solution/di-gui-fa-by-jason-2-8/

原文链接:https://leetcode-cn.com/problems/range-sum-of-bst/solution/di-gui-fa-by-jason-2-8/

int rangeSumBST(TreeNode* root, int L, int R) {       if (root == NULL) return 0;             int left_sum = 0,right_sum = 0;     	// R 大于等于 root -> val  说明 二叉搜索树的root -> right 可能有 L 和 R区间的数据       if (root -> val <= R) {            left_sum = rangeSumBST(root -> right,L,R);        }       //L 小于等于 root -> val  说明 二叉搜索树的root -> left 可能有 L 和 R区间的数据        if(root -> val >= L) {            right_sum = rangeSumBST(root -> left,L,R);        }		        int ans = left_sum + right_sum;        //加上这个根节点的数据        if (root -> val >= L && root -> val <= R) {            ans+= root -> val;        }       return ans;    }

时空复杂度分析:

时间复杂度: 为O(N) N为二叉搜索树的节点总数;

空间复杂度: 为O(N);

解法二: 使用stack容器

思路是和解法一相似;

int rangeSumBST(TreeNode* root, int L, int R) {       if (root == NULL) return 0;        stack
temp; temp.push(root); int ans = 0; while(!temp.empty()) { TreeNode* current = temp.top(); temp.pop(); cout << current -> val << endl; if (current -> val >= L && current -> val <= R) { ans += current -> val ; } if (current -> val <= R && current -> right) { temp.push(current -> right); } if (current -> val >= L && current -> left) { temp.push(current -> left); } } return ans; }

时空复杂度分析:

时间复杂度: 为O(N) N为二叉搜索树的节点总数;

空间复杂度: 为O(N);

解法三:最简化的版本

不使用额外变量:这位老哥对于递归的使用已经非常熟练链接:https://leetcode-cn.com/u/li-zi-he/

int rangeSumBST(TreeNode* root, int L, int R) {        if(root == NULL){            return 0;        }        if(root->val > R){            return rangeSumBST(root->left, L, R);        } else if(root->val < L){            return rangeSumBST(root->right, L, R);        } else {            return root->val + rangeSumBST(root->left, L, R) + rangeSumBST(root->right, L, R);        }    }

时空复杂度分析:

时间复杂度: 为O(N) N为二叉搜索树的节点总数;

空间复杂度: 为O(N);

转载地址:http://jdyki.baihongyu.com/

你可能感兴趣的文章
正则表达式
查看>>
Java I/O
查看>>
序列化
查看>>
Perl 精萃
查看>>
Perl 简介
查看>>
Perl 注释
查看>>
数据类型之标量
查看>>
调试 Perl 脚本
查看>>
增强的for循环语句
查看>>
方法的可变参数
查看>>
静态导入
查看>>
java 泛型
查看>>
控制结构
查看>>
标准输入输出
查看>>
运算符
查看>>
数据类型之列表与数组
查看>>
比较字符串
查看>>
Java EE 精萃
查看>>
Open Source 精萃
查看>>
Java EE 简介
查看>>