ningendo

二叉树和BST的递归,带条件

一.描述

  还是举二叉树求和的例子,但这次是带了条件。

  可以先看上一篇二叉树求和的文章 

 

二.图解分析

思路和普通二叉树求和一样,用当前节点的值加上左子树和右子树

Sum = cur.val + cur.left.val + cur.right.val

若不满足条件的就是

Sum =cur.left.val + cur.right.val

不加上自己的值即可

 

 

三.代码

 

private static void TestConditionSum(){
        TreeNode r1 = BTUtils.generateTreeNode(new Integer[]{1,2,3,4,5,6,7});
        System.out.println(conditionSum(r1));
    }

    private static int conditionSum(TreeNode root){
        if(root==null){
            return  0;
        }
        //設置條件過濾掉 >=6的元素,即不加上自己
        if(root.getVal()>=6){
            return conditionSum(root.getLeft())+conditionSum(root.getRight());
        }
        //進入到這個邏輯的就是 <6 的元素,加上自己
        return root.getVal()+conditionSum(root.getLeft())+conditionSum(root.getRight());
    }

 

输出:15

 

四.BST求和的例子

  题源:https://leetcode-cn.com/problems/range-sum-of-bst/

 

节点遇到<7的数时向右找

sum = right.val

节点遇到>15的数时向左找

sum = left.val

其他情况

sum = val+left.val+right.val

  代码:

class Solution {
    public int rangeSumBST(TreeNode root, int L, int R) {
       if(root==null){
            return 0;
        }
        //用排除的方式遞歸
        // val< L 就去右子树找更大的值 排除掉当前的val
        if(root.val<L){
            return rangeSumBST(root.right,L,R);
        }
        //同上 val>R的去左子树找,略过当前val
        if(root.val>R){
            return rangeSumBST(root.left,L,R);
        }
        //用排除法后 实际上就是 L<=root.val<=R 会进到下面的逻辑 进行求和
        return root.val+ rangeSumBST(root.right,L,R)+ rangeSumBST(root.left,L,R);
    }
}

 

五:总结

  在递归遇到条件时,利用下列模板来实现,这样就排除了当前递归到的元素,不将当前元素计算进去了

    if(...条件...){

     return function(下一个迭代元素)

    }

   return 当前元素 + function(下一个元素)

 

posted on 2020-12-16 20:15  Lunamonna  阅读(66)  评论(0编辑  收藏  举报

导航