力扣每日一题 在受污染的二叉树中查找元素 哈希 DFS 二进制

本文讨论了在受污染的二叉树中查找元素的三种方法:使用二进制搜索、哈希表和暴力版。分别分析了它们的时间复杂度(O(n)到O(min(h,log2target)))和空间复杂度(O(n))。
摘要由CSDN通过智能技术生成

Problem: 1261. 在受污染的二叉树中查找元素在这里插入图片描述

思路

👨‍🏫 灵神题解

💖 二进制

  • 时间复杂度:初始化为 O ( 1 ) O(1) O(1);find 为 O ( m i n ( h , l o g 2 t a r g e t ) O(min(h,log_2target) O(min(h,log2target),其中 h 为二叉树的高度
  • 空间复杂度: O ( 1 ) O(1) O(1)
class FindElements {
    private TreeNode root;

    public FindElements(TreeNode root) {
        this.root = root;
    }

    public boolean find(int target) {
        target++;
        TreeNode cur = root; // 从根节点出发
        for (int i = 30 - Integer.numberOfLeadingZeros(target); i >= 0; i--) { // 从次高位开始枚举
            int bit = (target >> i) & 1; // target 第 i 位的比特值
            cur = bit == 0 ? cur.left : cur.right;
            if (cur == null) { // 走到空节点,说明 target 不在二叉树中
                return false;
            }
        }
        return true; // 没有走到空节点,说明 target 在二叉树中
    }
}

在这里插入图片描述

💖 哈希表

复杂度分析

  • 时间复杂度:初始化为 O ( n ) O(n) O(n),其中 n n n 为二叉树的节点个数。find 为 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( n ) O(n) O(n)
class FindElements {
    private final Set<Integer> s = new HashSet<>();

    public FindElements(TreeNode root) {
        dfs(root, 0);
    }

    public boolean find(int target) {
        return s.contains(target);
    }

    private void dfs(TreeNode node, int val) {
        if (node == null) {
            return;
        }
        s.add(val);
        dfs(node.left, val * 2 + 1);
        dfs(node.right, val * 2 + 2);
    }
}

💖 暴力版

  • 时间复杂度:
    • 转换: O ( n ) O(n) O(n)
    • 查找: O ( n m ) O(nm) O(nm)
  • 空间复杂度: O ( n ) O(n) O(n)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class FindElements {
    TreeNode r;
    public FindElements(TreeNode root) {
        r = root;
        if(root == null) return;
        root.val = 0;
        dfs(root);
    }

    void dfs(TreeNode cur)
    {
        if(cur == null)
            return;
        if(cur.left != null)
        {
            cur.left.val = cur.val * 2 + 1;
            dfs(cur.left);
        }
        if(cur.right != null)
        {
            cur.right.val = cur.val * 2 + 2;
            dfs(cur.right);
        }
    }
    
    boolean f(TreeNode cur, int x)
    {
        if(cur == null)
            return false;
        if(cur.val == x)
            return true;
        if(f(cur.left,x) || f(cur.right,x))
            return true;
        return false;
    }

    public boolean find(int target) {
        return f(r,target);
    }
}

/**
 * Your FindElements object will be instantiated and called as such:
 * FindElements obj = new FindElements(root);
 * boolean param_1 = obj.find(target);
 */
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值