簡體   English   中英

我使用 forEach 實現的廣度優先搜索不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM