我知道这个想法是首先在树上进行级别订单遍历。
如果在相同级别上找到节点,并且其父节点不匹配,则它们是表兄弟。
如果匹配,则为兄弟。
我可以通过以下方式进行关卡遍历
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是兄弟节点。
答案 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));