前言
Weekly Contest 110的第二题 二叉搜索树的范围和:
给定二叉搜索树的根结点
root
,返回L
和R
(含)之间的所有结点的值的和。二叉搜索树保证具有唯一的值。
返回日志的最终顺序
示例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
提示:
- 树中的结点数量最多为
10000
个。- 最终的答案保证小于
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。