给定二叉搜索树的根结点 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版权协议,转载请附上原文出处链接和本声明。