zoukankan      html  css  js  c++  java
  • 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找就可以。

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

  • 相关阅读:
    <!内容//>请问在CSS里面,这个符号是什么 意思?
    java.sql.Timestamp;
    struts做开发的时候action是继承Action方法还是ActionSupport方法
    @Autowired的用法和作用
    JavaScript方法和技巧大全
    Spring@Autowired注解与自动装配
    关于Class File Editor Source not found
    程序员:各种快捷键的用法及掌握 .
    Struts2的Preparable接口 .
    测试
  • 原文地址:https://www.cnblogs.com/FannyChung/p/leetcode1261.html
Copyright © 2011-2022 走看看