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找就可以。

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

原文地址:https://www.cnblogs.com/FannyChung/p/leetcode1261.html