美文网首页
leetcode 938. 二叉搜索树的范围和

leetcode 938. 二叉搜索树的范围和

作者: topshi | 来源:发表于2019-06-03 14:56 被阅读0次

    题目描述

    给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
    二叉搜索树保证具有唯一的值。
    相关话题: 树、递归   难度: 简单

    示例 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

    提示:
    树中的结点数量最多为 10000 个。
    最终的答案保证小于 2^{31}

    思路:
    一看到二叉树,很自然会想到递归。

    • 我们需要搞清除两点:1.递归结束的条件 2.如果不满足递归结束条件做何操作
      • 递归结束条件
      if(root == null) return 0;
      
      • 子问题

        例如我们要求这棵树的范围和,可以假设节点10的左右子树的范围和都算出来了(通过递归),此时如果当前节点10范围刚好在LR之间,就直接加上去。
    return root.val + rangeSumBST(root.right, L, R) + rangeSumBST(root.left, L, R);
    

    如果root.val < L,那么root的左子树都不可能在LR之间,遍历右子树即可;反之,root.val > R,遍历左子树。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int rangeSumBST(TreeNode root, int L, int R) {
            if(root == null) return 0;
            if(root.val < L){
                return rangeSumBST(root.right, L, R);
            }else if(root.val > R){
                return rangeSumBST(root.left, L, R);
            }
            return root.val + rangeSumBST(root.right, L, R) + rangeSumBST(root.left, L, R);
        }
    }
    

    或者从底到顶递归遍历的方式累加

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int rangeSumBST(TreeNode root, int L, int R) {
            return rangeSumBST(root, L, R, new int[1]);
        }
        private int rangeSumBST(TreeNode root, int L, int R, int[] sum){
            if(root == null) return 0;
            rangeSumBST(root.left, L, R, sum);
            rangeSumBST(root.right, L, R, sum);
            if(root.val >= L && root.val <= R){
                sum[0] += root.val;
            }
            return sum[0];
        }
    }
    

    相关文章

      网友评论

          本文标题:leetcode 938. 二叉搜索树的范围和

          本文链接:https://www.haomeiwen.com/subject/qmlcxctx.html