zoukankan      html  css  js  c++  java
  • LeetCode 1261 在受污染的二叉树中查找元素 Find Elements in a Contaminated Binary Tree

    地址 https://leetcode-cn.com/contest/weekly-contest-163/problems/find-elements-in-a-contaminated-binary-tree/

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

    root.val == 0
    如果 treeNode.val == x 且 treeNode.left != null,那么 treeNode.left.val == 2 * x + 1
    如果 treeNode.val == x 且 treeNode.right != null,那么 treeNode.right.val == 2 * x + 2
    现在这个二叉树受到「污染」,所有的 treeNode.val 都变成了 -1。

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

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

    样例1

    输入:
    ["FindElements","find","find"]
    [[[-1,null,-1]],[1],[2]]
    输出:
    [null,false,true]
    解释:
    FindElements findElements = new FindElements([-1,null,-1]); 
    findElements.find(1); // return False 
    findElements.find(2); // return True 

    样例2

    输入:
    ["FindElements","find","find","find"]
    [[[-1,-1,-1,-1,-1]],[1],[3],[5]]
    输出:
    [null,true,true,false]
    解释:
    FindElements findElements = new FindElements([-1,-1,-1,-1,-1]);
    findElements.find(1); // return True
    findElements.find(3); // return True
    findElements.find(5); // return False

    样例3

    输入:
    ["FindElements","find","find","find","find"]
    [[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]]
    输出:
    [null,true,false,false,true]
    解释:
    FindElements findElements = new FindElements([-1,null,-1,-1,null,-1]);
    findElements.find(2); // return True
    findElements.find(3); // return False
    findElements.find(4); // return False
    findElements.find(5); // return True
    
    提示:
    
    TreeNode.val == -1
    二叉树的高度不超过 20
    节点的总数在 [1, 10^4] 之间
    调用 find() 的总次数在 [1, 10^4] 之间
    0 <= target <= 10^6

    算法1
    使用数组表示二叉树 根为x 则左子树为2x+1 右子树为2x+2
    恰好索引就是题目中各个节点的值

    那么建立一个数组 记录输入二叉树所拥有的节点 查询就非常简单 直接根据查询值看该数组的索引是否已经标记

    C++ 代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class FindElements {
    public:
    
        vector<int> record;
    
    void Dfs(TreeNode* root, int k) {
        if (root == NULL)
            return;
        root->val = k;
        record[k] = 1;
    
        Dfs(root->left, k * 2 + 1);
        Dfs(root->right, k * 2 + 2);
    }
    
     FindElements(TreeNode* root) {
        record.resize(10000000, -1);
        Dfs(root, 0);
    }
    
    bool find(int target) {
        return record[target] == 1;
    }
    
    };
    
    /**
     * Your FindElements object will be instantiated and called as such:
     * FindElements* obj = new FindElements(root);
     * bool param_1 = obj->find(target);
     */
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    JAVA005-基本数据类型变量的存储
    JAVA003-变量、数据类型
    Python_pandas数据处理_学习
    python_性能FPS
    DB_004_创建表
    DB_003_关系数据库标准语言(SQL)
    DB_002_数据库的创建和管理
    DB_001_概念模型设计
    虚幻蓝图学习笔记 简单VR功能实现
    虚幻蓝图学习笔记 制作第一人称(实现功能:捡枪,换枪,扔枪,仍炸弹等)(一)
  • 原文地址:https://www.cnblogs.com/itdef/p/11876133.html
Copyright © 2011-2022 走看看