树之二叉树(2)

965. 单值二叉树

题目描述

 思路:广度优先搜索

我们先进行一次深度优先搜索,获取这颗树中的所有节点的值。然后,就可以判断所有节点的值是不是都相等了。

代码:

class Solution {
    List<Integer> vals;
    public boolean isUnivalTree(TreeNode root) {
        vals = new ArrayList();
        dfs(root);
        for (int v: vals)
            if (v != vals.get(0))
                return false;
        return true;
    }

    public void dfs(TreeNode node) {
        if (node != null) {
            vals.add(node.val);
            dfs(node.left);
            dfs(node.right);
        }
    }
}

938. 二叉搜索树的范围和

题目描述

 方法一:无脑法

代码:

class Solution {
    List<Integer> list=new ArrayList<Integer>();
    int sum=0;
    int temp=0;
    public int rangeSumBST(TreeNode root, int low, int high) {
       addValue(root);
       for(int i=0;i<list.size();i++){
               temp=(Integer)list.get(i);
           if(low<=temp&&temp<=high){
             sum+=temp;
           }
       }
   return sum; }
    public void addValue(TreeNode node){
        if(node==null){
            return;
        }
        if(node!=null){
            list.add(node.val);
        }
        addValue(node.left);
        addValue(node.right);

    }
}

 方法二

思路:深度优先搜索

具体代码

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

530. 二叉搜索树的最小绝对差

题目描述

 

 

 思路:中序遍历

方法一:无脑法

class Solution {
    List list=new ArrayList();
    public int getMinimumDifference(TreeNode root) {
        zxbl(root);
        int min=Integer.MAX_VALUE;;
        for(int i=0;i<list.size()-1;i++){
            min=Math.min((Integer) list.get(i+1)-(Integer) list.get(i),min);
        }
  return min;  }
    public void zxbl(TreeNode node){
        if(node==null){
            return;
        }
        if(node.left!=null){
            zxbl(node.left);
        }
        list.add(node.val);
        if(node.right!=null){
            zxbl(node.right);
        }
    }
}

方法二:

思路与算法

本题要求二叉搜索树任意两节点差的绝对值的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。

朴素的方法是经过一次中序遍历将值保存在一个数组中再进行遍历求解,我们也可以在中序遍历的过程中用 \textit{pre}pre 变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是 \textit{pre}pre 的初始值需要设置成任意负数标记开头,下文代码中设置为 -1。

代码

class Solution {
    int pre;
    int ans;

    public int getMinimumDifference(TreeNode root) {
        ans = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return ans;
    }

    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            ans = Math.min(ans, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值