在JavaScript中的二叉树中查找两个节点是表兄弟节点还是同级节点

时间:2018-10-05 08:26:09

标签: javascript data-structures binary-tree

我知道这个想法是首先在树上进行级别订单遍历

如果在相同级别上找到节点,并且其父节点不匹配,则它们是表兄弟

如果匹配,则为兄弟

我可以通过以下方式进行关卡遍历

BinarySearchTree.prototype.levelOrderTraversal = function() {
    var q = [];
    var results = [];
    var _root = this.root;
    if(_root) {
        q.push(_root);
        while(q.length > 0) {
            var temp = q.shift();
            results.push(temp.value);
            if(temp.left) {
                q.push(temp.left);
            }
            if(temp.right) {
                q.push(temp.right);
            }
        }
        return results;
    }else {
        return null;
    }

}

但是现在我该如何跟踪父母,以便找到给定的节点是兄弟姐妹还是堂兄?

例如,

如果我的关卡遍历给了我

[3,2,4,1,5]

3是root,2和4是兄弟姐妹或父级3。

1是父母2的左子女。

5是父母4的正确子女。

因此,1和5是表兄弟节点,而2和4是兄弟节点。

1 个答案:

答案 0 :(得分:1)

您可以存储通向所需节点的路径,并检查路径的长度和末尾或末尾之前的元素的长度,以获取关系。

function getPath(node, value, path = []) {
    if (!node) {
        return;
    }
    if (node.value === value) {
        return path;
    }
    return getPath(node.left, value, path.concat(node.value))
        || getPath(node.right, value, path.concat(node.value));
}

function findRelation(root, a, b) {
    var pathA = getPath(root, a),
        pathB = getPath(root, b);

    if (pathA.length !== pathB.length) {
        return;
    }
    if (pathA.length && pathA[pathA.length - 1] === pathB[pathB.length - 1]) {
        return 'siblings';
    }

    if (pathA.length > 1 && pathA[pathA.length - 2] === pathB[pathB.length - 2]) {
        return 'cousins';
    }
}

var tree = { value: 3, left: { value: 2, left: { value: 1 } }, right: { value: 4, right: { value: 5 } } };

console.log(findRelation(tree, 2, 4));
console.log(findRelation(tree, 1, 5));