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

    938_二叉搜索树的范围和

    package 二叉树.二叉搜索树;
    
    import java.awt.HeadlessException;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    
    /**
     * https://leetcode-cn.com/problems/range-sum-of-bst/
     * 
     * @author Huangyujun
     * 题意是给了一颗 二叉搜素树(有点特殊的树),我这种是通法~啥树都可以
     * 
     */
    public class _938_二叉搜索树的范围和 {
        //思路一:遍历(随便一种遍历方式都可以,去比较一下即可了)
        int low = 0;
        int hight = 0;
        int sum = 0;
        public int rangeSumBST(TreeNode root, int low, int high) {
            this.low = low;
            this.hight = high;
            inorder(root);
    //        for()到这里又遍历了一次list锁定范围,不快了
            return sum;
        }
        List<Integer> list = new ArrayList<>(); 
        public void inorder(TreeNode root) {
            if(root == null)    return;
            inorder(root.left);
            //拿到当前值
    //        list.add(root.val);
            if(root.val >= low && root.val <= hight) {
                sum += root.val;
            }
            inorder(root.right);
        }
        
        //思路二:递归利用二叉搜索树(根大于左子树,根小于右子树)~ 卡在了根在范围内~
        public int rangeSumBST2(TreeNode root, int low, int high) {
            if(root == null) return 0;
            if(root.val < low) {    //只能考虑右子树了
                return rangeSumBST2(root.right, low, high);
            }else if(root.val > high) {    //只能考虑左子树
                return rangeSumBST2(root.left, low, high);
            }    
            //根在范围内的话,(加上 考虑左子树和右子树的情况)~ 递归含义透彻理解:    
            return root.val + rangeSumBST2(root.left, low, high) + rangeSumBST2(root.right, low, high);
        }
        
        //思路三:非递归实现 【队列:当前层的结点一个一个拿出来判断,若当前结点值范围大于high,考虑左子树区域,当前结点值小于low,考虑右子树区域,等于直接累加范围,然后左右子树区域都有可能】
        class Solution2 {
            public int rangeSumBST(TreeNode root, int low, int high) {
                int sum = 0;
                Queue<TreeNode> q = new LinkedList<TreeNode>();
                q.offer(root);
                while (!q.isEmpty()) {
                    TreeNode node = q.poll();
                    if (node == null) {
                        continue;
                    }
                    if (node.val > high) {
                        q.offer(node.left);
                    } else if (node.val < low) {
                        q.offer(node.right);
                    } else {
                        sum += node.val;
                        q.offer(node.left);
                        q.offer(node.right);
                    }
                }
                return sum;
            }
        }
    }

    本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709290.html

  • 相关阅读:
    堆、栈、值类型、引用类型分析总结 Part 2
    DataGridView打印
    学习使用ArrayList
    C#与Java之比较
    【原创】串口通信测试程序
    彩色校验码的制作
    C#中使用进度条
    【原创】 Ajax之ModalPopup编程实例
    常用正则表达式
    堆、栈、值类型、引用类型分析总结 Part 1
  • 原文地址:https://www.cnblogs.com/shan333/p/15709290.html
Copyright © 2011-2022 走看看