二叉搜索树的范围和

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

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

操作很简单,深度优先遍历
两步操作:
第一,判断当前节点是否为空,如果不为空执行下一步,为空不执行
第二,判断当前的节点的值是否符合题意在L和R之间,如果符合将该值加入到总和中。,并执行该点的左右孩子
第三,继续往下判断,根据二叉搜索树的特性,如果该值小于L,搜索该节点的右孩子,如果大于R搜索左孩子。

     int count=0;
    public int rangeSumBST (TreeNode root, int L, int R) {
         dp(root,L,R);
        return count;
    }

    public void dp (TreeNode root, int L, int R) {
        if (root != null) {
            if (root.val >= L && root.val <= R) {
                count += root.val;
                dp(root.left, L, R);
                 dp(root.right, L, R);
            }
            if (root.val > R) {
                dp(root.left, L, R);
            }
            if (root.val < L) {
                dp(root.right, L, R);
            }
        }
    }

简化代码

int count=0;
    public int rangeSumBST (TreeNode root, int L, int R) {
        dps(root,L,R);
        return count;
    }

    public void dps (TreeNode root, int L, int R) {
        if (root != null) {
            if (root.val > L && root.val < R) {
                count += root.val;
            }
            if (root.val > L) {
                dps(root.left, L, R);
            }
            if (root.val < R) {
                dps(root.right, L, R);
            }
        }
    }

这种解法巧妙之处在于:
在进行第二步骤之后,会继续进行判断,这么就会分为三种情况:
1、如果该节点的值在L和R之间,该点的左右孩子都会被执行
2、如果该节点小于L,那么只会执行该节点的右孩子
3、如果该节点大于R,那么只会执行该节点的左孩子。


版权声明:本文为li15006474642原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。