【力扣每日一题】力扣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();
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 12:00:08       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 12:00:08       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 12:00:08       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 12:00:08       18 阅读

热门阅读

  1. 软考 系统架构设计师之回归及知识点回顾(4)

    2024-03-14 12:00:08       22 阅读
  2. 临近取样(KNN)算法基本原理&sklearn实现

    2024-03-14 12:00:08       15 阅读
  3. 各个类型和Json类型的相互转换

    2024-03-14 12:00:08       22 阅读
  4. 【算法】KY33 密码翻译

    2024-03-14 12:00:08       18 阅读
  5. 力扣Python方法解析

    2024-03-14 12:00:08       19 阅读
  6. Element Plus与Ant Design Vue:选型对比

    2024-03-14 12:00:08       18 阅读
  7. JVM-2

    JVM-2

    2024-03-14 12:00:08      16 阅读
  8. Ribbon

    2024-03-14 12:00:08       20 阅读
  9. SpringBoot中的HttpServletRequest

    2024-03-14 12:00:08       19 阅读
  10. Linux tar静态编译过程记录

    2024-03-14 12:00:08       21 阅读