Что может привести к тому, что оператор return не будет работать в блоке кода if - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь сравнить два двоичных дерева, чтобы увидеть, равны ли они по структуре и значению, но в какой-то момент в алгоритме оператор return не работает, когда помещается в блок кода if только для тех значений, которые я хочу сравнивать. * 1001 то есть *

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, но когда выдается ошибка, он работает.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Ваш рекурсивный вызов ... 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))
0 голосов
/ 20 июня 2019

Можете ли вы попробовать этот код, я думаю, что он может решить вашу проблему.

/* 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.";  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...