【问题标题】:Find if two nodes are cousin nodes or sibling nodes in Binary Tree in JavaScript在JavaScript中的二叉树中查找两个节点是表亲节点还是兄弟节点
【发布时间】:2018-10-05 08:26:08
【问题描述】:

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

如果节点位于同一级别并且它们的父节点不匹配,则它们是堂兄弟

如果匹配,他们是兄弟姐妹

我可以通过以下方式进行级别顺序遍历

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 是根,2 和 4 是兄弟姐妹或父 3。

1 是父母 2 的左孩子。

5 是父母 4 的右孩子。

所以,1 和 5 是表亲节点,而 2 和 4 是兄弟节点。

【问题讨论】:

  • 你有一些数据要测试吗?
  • @NinaScholz 刚刚更新了问题。
  • 请添加树对象和结果,你喜欢的数据结构。
  • 你还想采取同样的水平遍历还是其他,比如深度优先?
  • @NinaScholz 一切都很好,我只是不知道该走哪条路。我在某处读到的级别命令也可以实现,但无论如何应该没问题。

标签: javascript data-structures binary-tree


【解决方案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));

【讨论】:

  • 太棒了。你是一个真正的传奇 :) 如此不同的思维方式 :) 你能否建议我一些关于如何以完全不同的方式解决问题的事情。
  • "您能否建议我一些关于如何以完全不同的方式解决问题的建议。" ad hoc?什么看起来更短。但说真的,你需要一些事情是如何工作的,比如树、迭代和递归。如果不知道,那就多尝试几次。这就是软件/编程的美妙之处,您可以尝试任何事情而不会造成伤害。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
相关资源
最近更新 更多