Javascript 二叉树

Javascript 二叉树,javascript,arrays,binary-tree,Javascript,Arrays,Binary Tree,我正在尝试使用javascript来解决这个问题,它正在做一个二进制搜索,重新创建2*x和10*x+1的树,从给定的输入a到另一个输入b,但是我的程序似乎只能搜索2*x处的节点,而那些10*x+1似乎被忽略了。有趣,为什么?谢谢 var tt = readline().split(' '); var a = parseInt(tt[0]); var b = parseInt(tt[1]); print(f([],a,b)); function f(arr,x,b){ if (x>

我正在尝试使用javascript来解决这个问题,它正在做一个二进制搜索,重新创建
2*x
10*x+1
的树,从给定的输入
a
到另一个输入
b
,但是我的程序似乎只能搜索
2*x
处的节点,而那些
10*x+1
似乎被忽略了。有趣,为什么?谢谢

var tt = readline().split(' ');
var a = parseInt(tt[0]);
var b = parseInt(tt[1]);

print(f([],a,b));
function f(arr,x,b){
    if (x>b){
        return [];
    }else if (x==b){
        return _add(arr,x);
    }else{
        return (f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b));
    }
}

function _add(array,x){
    var _arr = array.slice();
    _arr.push(x);
    return _arr;
}

您需要返回
false
,而不是空数组。空数组解析为
true
,这意味着您只迭代左分支

(顺便说一句,如果零件返回,则不需要其他零件。)

功能go(a、b){
//var tt=readline().split(“”);
//var a=parseInt(tt[0]);
//var b=parseInt(tt[1]);
功能f(arr、x、b){
如果(x>b){
返回false;//否[!!!
} 
如果(x==b){
返回加(arr,x);
}
返回(f(_add(arr,x),(2*x),b)| f(_add(arr,x),(10*x+1),b));
}
函数_添加(数组,x){
var_arr=array.slice();
_arr.push(x);
返回_arr;
}
返回f([],a,b);
}
控制台日志(go(2162));
控制台日志(go(4,42));
控制台日志(go(10040021))
.as控制台包装{最大高度:100%!重要;顶部:0;}
两个问题:

  • 真实性。在javascript中,falsy值是
    false
    null
    未定义的
    0
    NaN
    和空字符串(
    )。所有其他值均为真

    您正在为基本情况返回一个数组:

    return [];
    
    所以这永远是真的

  • |
    操作符的工作方式。
    |
    操作员短路。因此,如果左边的值是truthy,它将返回它,而不会计算右边的代码

    你写道:

    f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b)
    
    因为在所有情况下,
    f()
    都不会返回任何错误,所以表达式基本上是:

    true || f(_add(arr,x),(10*x+1),b)
    
    因此,
    |
    操作符从不计算
    10*x+1
    案例


  • 要使代码正常工作,您需要编写一个函数来选择一个非空数组,而不是使用
    |
    操作符,或者使
    f()
    返回false或0作为基本情况,而不是空数组(这可能会破坏算法,我不知道,因为我不知道算法)。

    谢谢您的帮助,我从来没有注意到[]在javascriptA中是一个真值问题:为什么([]==true)会返回false?对此我不确定,但
    []
    确实是真的:
    如果([]{console.log('HA')}
    打印“HA”。
    =
    运算符可能正在触发某些类型转换。请注意,
    |
    操作符的行为类似于
    if
    而不是
    =
    []| |“mango”
    返回
    []
    而不是“mango”,并且
    []| console.log('HA')
    不打印任何内容,而
    []&&console.log('HA')
    打印“HA”,这很有趣,javascript中的
    ==
    是如何工作的the@MichaelLee:见: