二叉搜索树的范围和(938)

题目: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。

示例:
在这里插入图片描述
思路分析:
一、按照题目所给为BST,首先想到的是按照遍历,将其所有结点全遍历进列表之中,然后上一个循环来将列表中的所有值循环一遍,写完之后,我发现这是个笨办法,因为提交了以后就超过时间限制了,所以就要想办法,精简程序。
二、依旧是遍历每个结点,在遍历中就将符合范围内的结点加入求和变量之中。
三、直接分大方向,当根节点值小于左范围时,直接进入右子树进行判断,可以节省在另左子树上浪费的时间,当根节点值大于右范围时,右子树的值比根节点还要大,所以直接返回左子树进行查找;如果根节点值正好处于左右两范围之间的话,那么对该值进行判断,然后继续判断其左右子树上的结点是否在范围之内。

Code ------ 二

class Soulution {
	int sum = 0;
	public int rangeSumBST(TreeNode root, int L, int R) {
		helper(root, L, R);
		return sum;
	}
	public void helper(TreeNode root, int L, int R) {
		if (root == null) {
			return;
		}
		if (root.val <= R && root.val >= L) {
			sum += root.val;
		}
		helper(root.left, L, R);
		helper(root.right, L, R);
	}
}

时间复杂度分析:
1.时间复杂度:O(N):需将全树结点遍历一遍且仅一遍。
2.空间复杂度:O(N):递归调用辅助栈空间。

Code ------ 三

class Solution {
	int sum = 0;
	public int rangeSumBST(TreeNode root, int L, int R) {
		helper(root, L, R);
		return sum;
	}
	public void helper(TreeNode root, int L, int R) {
		if (root == null) {
			return;
		}
		if (root.val > R) {
			helper(root.left, L, R);
		}
		if (root.val < L) {
			helper(root.right, L, R);
		}
		if (root.val <= R && root.val >= L) {
			sum += root.val;
		}
	}
}

时间复杂度分析:
1.时间复杂度:O(N)
2.空间复杂度:O(N)
ps:含义与上算法相同,但是O(N)只是对时间和空间上限的描述而不是确切的,故其包含的也是结点个数,但是实际运行起来,算法二肯定比算法一的时间要快,占用的空间要少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值