【力扣每日一题】力扣1261在受污染的二叉树中查找元素

题目来源

力扣1261在受污染的二叉树中查找元素

题目概述

给出一个满足下述规则的二叉树:

  1. root.val == 0
  2. 如果 treeNode.val == x 且 treeNode.left != null,那么 treeNode.left.val == 2 * x + 1
  3. 如果 treeNode.val == x 且 treeNode.right != null,那么 treeNode.right.val == 2 * x + 2

现在这个二叉树受到「污染」,所有的 treeNode.val 都变成了 -1

请你先还原二叉树,然后实现 FindElements 类:

  • FindElements(TreeNode* root) 用受污染的二叉树初始化对象,你需要先把它还原。
  • bool find(int target) 判断目标值 target 是否存在于还原后的二叉树中并返回结果。

思路分析

在构造器中可以使用树的各种遍历方式把树中原本有的元素加入到表中(可以是数组,列表,哈希表)。 在find函数中只需要判断目标元素是否在表中即可。

代码实现

java实现

public class FindElements {

    private Set<Integer> set = new HashSet<>();
    public FindElements(TreeNode root) {
        // 通过层序遍历方式转为哈希表
        if (root == null) {
            return;
        }
        root.val = 0;
        Queue<TreeNode> parentQueue = new LinkedList<>();
        parentQueue.add(root);
        Queue<TreeNode> childrenQueue = new LinkedList<>();
        while (!parentQueue.isEmpty()) {
            while (!parentQueue.isEmpty()) {
                TreeNode current = parentQueue.poll();
                this.set.add(current.val);
                if (current.left != null) {
                    if (current.left.val == -1) {
                        current.left.val = current.val * 2 + 1;
                    }
                    childrenQueue.add(current.left);
                }
                if (current.right != null) {
                    if (current.right.val == -1) {
                        current.right.val = (current.val + 1) * 2;
                    }
                    childrenQueue.add(current.right);
                }
            }
            Queue<TreeNode> temp = parentQueue;
            parentQueue = childrenQueue;
            childrenQueue = temp;
        }
    }

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

}

c++实现

class FindElements {
public:
    unordered_set<int> set;

    FindElements(TreeNode* root) {
        // 通过深度遍历方式(先序遍历)方式转为表
        dfs(root, 0);
    }

    void dfs(TreeNode* node, int val) {
        set.insert(val);
        if(node -> left != nullptr){
            dfs(node->left, val * 2 + 1);
        }
        if (node->right != nullptr) {
            dfs(node->right, (val + 1) * 2);
        }
    }

    bool find(int target) {
        return set.find(target) != set.end();
    }
};

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值