• leetcode1261在受污染的二叉树中查找元素


    题目

    一颗二叉树,树根值为0,父节点为x,则左子值为2x+1,右子为2x+2。现在只有树的结构,所有值都变为-1被污染了。求污染前是否存在某个值。

    构建一次树,查询会调用多次。

    题解

    这道题还是比较简单的,先复原树,然后根据要求查找。
    复原树的过程是传递node的值和node节点到递归函数,函数先设置x的值,然后递归处理。对null的node直接返回不执行任何操作。
    当然,也可以不用递归,用Queue进行层次遍历也可以。

    private void buildTree(TreeNode root,int val) {
        if(root==null){
            return;
        }
        root.val=val;
        buildTree(root.left,2*val+1);
        buildTree(root.right,2*val+2);
    }
    

    搜索也比较简单,可以用深度优先,也可以用层次遍历。
    可以利用现有的数值的特点,节点数值可以看做完全二叉树的编号,只是这棵树是中间有空缺的。
    先根据target倒推出路径上,然后再从树中判断是否存在。这个路径用左右表示,如果是左,则加入true,否则,加入false。

    public boolean find(int target) {
        if(root==null){
            return false;
        }
        Stack<Boolean> stack=new Stack<>();
        while(target>0){//题目说target>0,所以可以直接用=0跳出
            int parent=(target-1)>>1;
            if(parent*2+1==target){
                stack.push(true);
            }else{
                stack.push(false);
            }
            target=parent;
        }
        TreeNode node=root;
        while(!stack.isEmpty()){
            if(stack.pop()){
                node=node.left;
            }else{
                node=node.right;
            }
            if(node==null){
                return false;
            }
        }
        return true;
    }
    

    当然,如果想取巧一点,加快速度,那么可以在建树的时候把所有值加入set,查询直接在set找就可以。

    创建测试用例:
    空树
    单根树

  • 相关阅读:
    拷贝构造,移动构造,右值引用,左值,右值,std::move,std::forward,std::ref
    枚举类型 enum以及enum class
    C++ 静态库LIB的使用方法
    array(数组容器)
    C++标准模板库STL
    C++ 动态库DLL的使用方法
    函数指针与回调函数
    VS项目属性等一系列问题
    逻辑运算符(且或非),位运算符(异或),函数对象运算(bit_or)
    pinpoint-grpc编译异常问题记录
  • 原文地址:https://www.cnblogs.com/FannyChung/p/leetcode1261.html
Copyright © 2020-2023  润新知