我们遍历二叉树的每一个节点,判断他的值是否在[low, high]之间,如果在这个之间, 我们就统计他们的和。
class Solution {int sum = 0;public int rangeSumBST(TreeNode root, int low, int high) {recur(root, low, high);return sum;}public void recur(TreeNode root, int low, int high) {if (root == null) return;if (root.val >= low && root.val <= high) {sum += root.val;}recur(root.left, low, high);recur(root.right, low, high);}}
这题有个条件就是二搜索叉树,我们知道二叉搜索树的特点就是左子树的所有节点值都比 当前节点值小,右子树的所有节点值都比当前节点值大,如果我们按照中序遍历的方式打印的话,就会发现打印的结果是升序排列的。
上面那种解法遍历每一个节点,虽然也能解决问题,但很效率不是最好的,对于二叉搜索树
如果当前节点小于low,那么他它的左子树的所有节点肯定也都小于low,我们没必 要在遍历了,直接放弃
如果当前节点大于high,那么他的右子树的所有节点肯定也都大于high,也可以放弃
public int rangeSumBST(TreeNode root, int low, int high) {if (root == null) return 0;//当前节点以及他的右子树的值都太大了,不要了if (root.val > high) {return rangeSumBST(root.left, low, high);}//当前节点以及他的左子树的值都太小了,也不要了if (root.val < low) {return rangeSumBST(root.right, low, high);}//如果当前节点值在[low, high]之间,就留下return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);}
