zoukankan      html  css  js  c++  java
  • Leetcode 938 二叉搜索树的范围和

    题目定义:

    给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
    
    示例 1:
                              10
        					 /  
                            5    15
                           /       
                          3   7     18
    输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
    输出:32
        
    示例 2:
                              10
        					 /  
                            5    15
                          / |    |  
                         3  7    13 18
                       /    |
                      1     6 
    输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
    输出:23
    
    提示:
    
    树中节点数目在范围 [1, 2 * 104] 内
    1 <= Node.val <= 105
    1 <= low <= high <= 105
    所有 Node.val 互不相同
    
    

    递归方式:

    class Solution {
        private int sum = 0;  //定义一个总数
        public int rangeSumBST(TreeNode root, int low, int high) {
            if(root == null)
                return sum;
            dfs(root,low,high);
            return sum;
        }
        private void dfs(TreeNode root,int low,int high){
            if(root == null)
                return;
            if(root.val >= low && root.val <= high){  //若root在范围内,则需要遍历两个子节点
                sum += root.val;
                dfs(root.left,low,high);
                dfs(root.right,low,high);
            }else{   //否则只需要遍历一个子节点
                if(root.val < low)
                    dfs(root.right,low,high);
                else
                    dfs(root.left,low,high);
            }
        }
        
    }
    

    优化递归的方式:

    class Solution {
        private int sum = 0;
        public int rangeSumBST(TreeNode root, int low, int high) {
            if(root == null)
                return 0;
            dfs(root,low,high);
            return sum;
        }
        private void dfs(TreeNode root,int low,int high){
            if(root == null)
                return;
            if(low <= root.val && root.val <= high)
                sum += root.val;
            if(root.val < high)
                dfs(root.right,low,high);
            if(root.val > low)
                dfs(root.left,low,high);
        }
    }
    

    广度优先遍历方式:

    class Solution {
        public int rangeSumBST(TreeNode root, int low, int high) {
            if(root == null)
                return 0;
            Queue<TreeNode> queue =new LinkedList<>();
            int sum = 0;
            queue.offer(root);
            while(queue.size() > 0){
                TreeNode node = queue.poll();
                if(low <= node.val && node.val <= high)
                    sum += node.val;
                if(node.left != null && node.val > low)
                    queue.offer(node.left);
                if(node.right != null && node.val < high)
                    queue.offer(node.right);
            }
            return sum;
        }
    }
    

    参考:

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

  • 相关阅读:
    C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)
    2014年个人总结
    是去是留?这是个问题
    电信限制ip的解决方案
    机械学习
    mac-mysql
    如何使用代码生成工具
    如何使用自定义表单和自定义流程
    test
    编程小问题001
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14137570.html
Copyright © 2011-2022 走看看