【问题标题】:What could cause a return statement not to work in an if code block什么可能导致 return 语句在 if 代码块中不起作用
【发布时间】:2019-06-20 14:17:03
【问题描述】:

我正在尝试比较两个二叉树以查看它们在结构和值上是否相等,但在算法中的某个点,当仅针对我想要的值放置在 if 代码块中时,return 语句不起作用比较。 即

let a = "myVal"
let b = "myVal"

if(a = b){
    return false
}

以上内容不适用于我想比较的变量,但适用于所有其他变量。

我已经检查了两个变量的类型和值,它们确实是相等的。

此外,当我在 if 代码块中抛出错误时,它会在满足条件但 return 语句不起作用时起作用。

这是完整的代码

function compare(a, b){
    if(a === null && b === null){
        return true;
    }
    if(typeof a === 'object' && typeof b === 'object'){
        // compare their structures
        let aRoot = Object.keys(a);
        let bRoot = Object.keys(b);
        if(aRoot.length !== bRoot.length){
            console.log('0')
            return false; //Trees are of different structures
        }

        //Loop through the roots of the tree
        for(let i in aRoot){
            if(aRoot[i] !== bRoot[i]){
                //Make sure the roots are represented with equal names
                console.log('1')
                return false;
            }
            let aValue = a[aRoot[i]];
            let bValue = b[bRoot[i]];
            if(typeof aValue !== typeof bValue){
                console.log('2')
                return false
            }
            if(aValue !== null && bValue !== null){
                //If they are both of the same types compare their values check if they are child nodes or not
                if(typeof aValue !== 'object'){
                    //Here's the main problem
                    if(aValue !== bValue){
                        // console.log("aValue : ", aValue, " bValue : ", bValue)
                        // console.log("aValue type : ", typeof aValue, " bValue type : ", typeof bValue)
                        return false;
                    }
                }
                else{
                    // console.log('a ', aValue)
                    compare(aValue, bValue);
                }
            }
        }
    }
    return true;
}


let aNode = {val: 1, left: null, right: null, d: {val: 1, left: null, right: null, f: {val: 2, left: null, right: null}}};

let bNode = {val: 1, left: null, right: null, d: {val: 3/* This differs from aNode*/, left: null, right: null, f: {val: 2, left: null, right: null}}};

console.log(compare(aNode, bNode))

它适用于没有根节点的树,但不适用于有根节点的树。

问题出在代码的if(aValue !== bValue) 部分。该代码块不仅返回 false,而且当抛出错误时,它会起作用。

【问题讨论】:

  • if(a = b){ Typo => if(a == b){if(a === b){
  • 我看到您在其中有(注释掉)日志语句 - 您得到了什么结果?试着写一个字面意思的声明:console.log( a !== b) - 或者当时的确切测试。

标签: javascript algorithm if-statement binary-tree binary-search-tree


【解决方案1】:

你的递归调用...compare(aValue, bValue); 应该是return compare(aValue, bValue); 否则你会丢失调用返回的值

function compare(a, b){
    if(a === null && b === null){
        return true;
    }
    if(typeof a === 'object' && typeof b === 'object'){
        // compare their structures
        let aRoot = Object.keys(a);
        let bRoot = Object.keys(b);
        if(aRoot.length !== bRoot.length){
            console.log('0')
            return false; //Trees are of different structures
        }

        //Loop through the roots of the tree
        for(let i in aRoot){
            if(aRoot[i] !== bRoot[i]){
                //Make sure the roots are represented with equal names
                console.log('1')
                return false;
            }
            let aValue = a[aRoot[i]];
            let bValue = b[bRoot[i]];
            if(typeof aValue !== typeof bValue){
                console.log('2')
                return false
            }
            if(aValue !== null && bValue !== null){
                //If they are both of the same types compare their values check if they are child nodes or not
                if(typeof aValue !== 'object'){
                    //Here's the main problem
                    if(aValue !== bValue){
                        // console.log("aValue : ", aValue, " bValue : ", bValue)
                        // console.log("aValue type : ", typeof aValue, " bValue type : ", typeof bValue)
                        return false;
                    }
                }
                else{
                    // console.log('a ', aValue)
                    return compare(aValue, bValue);
// Check this ------^----^
                }
            }
        }
    }
    return true;
}


let aNode = {val: 1, left: null, right: null, d: {val: 1, left: null, right: null, f: {val: 2, left: null, right: null}}};

let bNode = {val: 1, left: null, right: null, d: {val: 3/* This differs from aNode*/, left: null, right: null, f: {val: 2, left: null, right: null}}};

console.log(compare(aNode, bNode))

【讨论】:

  • 糟糕,我的错。忘了return 递归调用。非常感谢人!现在可以使用了!
【解决方案2】:

你能试试这个代码吗,我想它可以解决你的问题。

/* Given two trees, return true if they are structurally identical */
int identicalTrees(node* a, node* b)  
{  
    /*1. both empty */
    if (a == NULL && b == NULL)  
        return 1;
    /* 2. both non-empty -> compare them */
    if (a != NULL && b != NULL)  
    {  
        return
        (  
            a->data == b->data &&  
            identicalTrees(a->left, b->left) &&  
            identicalTrees(a->right, b->right)  
        );  
    } 
    /* 3. one empty, one not -> false */
    return 0;  
}

然后将其用作:

if(identicalTrees(a, b))  
        cout << "Both tree are identical.";  
    else
        cout << "Trees are not identical.";  

【讨论】:

  • 请注意,javascript 的语法与 C++ 不同
  • 但是思路应该是一样的,if (a.value === b.value)
  • 这与我最初设计的解决方案非常相似,但有局限性。
  • 它只比较值而不是树本身的结构。我正在尝试比较两者。
猜你喜欢
  • 2021-01-28
  • 2022-08-17
  • 2015-07-30
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2014-01-17
  • 2015-05-09
  • 2015-01-08
相关资源
最近更新 更多