前言

Weekly Contest 110的第二题 二叉搜索树的范围和

给定二叉搜索树的根结点 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

解题思路

本题我选择了一个笨方法去完成,就是利用二叉搜索树的一个特性:通过中序遍历二叉搜索树后可以得到一个递增的有序序列。所以我选择了中序遍历二叉搜索树获得递增且有序的数组,然后遍历数组获取需要的数组元素进行累加。

实现代码

    /**
     * 938. 二叉搜索树的范围和
     * @param root
     * @param L
     * @param R
     * @return
     */
    public int rangeSumBST(TreeNode root, int L, int R) {
        List<Integer> list=new ArrayList<Integer>();
        int result=0;
        if(root!=null){
            inorderTraversal(root,list);
        }
        for(int i:list){
            if(i>=L && i<=R){
                result+=i;
            }
        }
        return result;
    }

    /**
     * 中序遍历(递归)
     * @param root
     * @param list
     */
    private void inorderTraversal(TreeNode root,List<Integer> list){
        if(root.left==null && root.right==null){
            list.add(root.val);
        }else if(root.left==null && root.right!=null){
            list.add(root.val);
            inorderTraversal(root.right,list);
        }else if(root.left!=null && root.right==null){
            inorderTraversal(root.left,list);
            list.add(root.val);
        }else{
            inorderTraversal(root.left,list);
            list.add(root.val);
            inorderTraversal(root.right,list);
        }
    }

Null
137 声望31 粉丝

免费的东西是最贵的,好走的只是下坡路