二叉树和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(下一个元素)