[英]My implementation of Breadth First Search with forEach doesn't work
這是我在 BinarySearchTree 類中的代碼。 我不知道是因為 forEach 的行為,還是因為我的代碼中的某個地方是錯誤的。
class BinarySearchTree {
constructor() {
this.root = null;
}
insert(val) {
let newNode = new Node(val)
if (!this.root) {
this.root = newNode;
return this;
} else {
let level = this.root
// if (val < level.value && level.left){
// level = level.left
while (true) {
if (val < level.value) {
if (level.left) {
level = level.left
} else if (!level.left) {
level.left = newNode;
return this
}
}
else if (val > level.value) {
if (level.right) {
level = level.right
} else if (!level.right) {
level.right = newNode;
return this
}
}
}
}
}
BFS() {
let data = [];
let queue = [];
if (!this.root) {
return false
} else if (this.root) {
queue.push(this.root)
while (queue.length) {
queue.forEach(function (element) {
if (element.left) {
queue.push(element.left)
}
if (element.right) {
queue.push(element.right)
}
queue.shift()
data.push(element)
})
}
return data
}
}
}
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
這是輸入
tree.insert(50)
tree.insert(70)
tree.insert(43)
tree.insert(45)
tree.insert(18)
tree.insert(52)
tree.insert(59)
console.log(tree.BFS())
這是輸出
[
Node {
value: 50,
left: Node { value: 43, left: [Node], right: [Node] },
right: Node { value: 70, left: [Node], right: null }
},
Node {
value: 43,
left: Node { value: 18, left: null, right: null },
right: Node { value: 45, left: null, right: null }
},
Node { value: 18, left: null, right: null },
Node { value: 18, left: null, right: null },
Node { value: 45, left: null, right: null }
]
如您所見,存在重復,並且樹的某些節點根本沒有顯示。 提前感謝大家!
如果調用forEach
, 則不應修改底層數組。 各種難以理解的行為都會產生。
正如@JDB 所提到的,您不應該修改forEach
中的底層數組。
盡管在這種情況下您不需要將forEach
用於BFS
,因為您只是遍歷樹。 您可以從隊列的前面一次處理一個元素,直到隊列為空。
class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } } class BinarySearchTree { constructor() { this.root = null; } insert(val) { let newNode = new Node(val) if (!this.root) { this.root = newNode; return this; } else { let level = this.root // if (val < level.value && level.left){ // level = level.left while (true) { if (val < level.value) { if (level.left) { level = level.left } else if (!level.left) { level.left = newNode; return this } } else if (val > level.value) { if (level.right) { level = level.right } else if (!level.right) { level.right = newNode; return this } } } } } BFS() { let data = []; let queue = []; if (!this.root) { return false } else if (this.root) { queue.push(this.root) while (queue.length) { const element = queue[0] data.push(element) if (element.left) { queue.push(element.left) } if (element.right) { queue.push(element.right) } queue.shift() } return data } } } const tree = new BinarySearchTree(); tree.insert(50) tree.insert(70) tree.insert(43) tree.insert(45) tree.insert(18) tree.insert(52) tree.insert(59) const result = tree.BFS() for (r of result) console.log(r)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.