'My implementation of Breadth First Search with forEach doesn't work

Here is my code inside a BinarySearchTree class. I don't know if it is because of the behaviour of forEach, or because somewhere in my code is wrong.

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;
    }
}

Here is the input

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())

Here is the output

[
  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 }
]

As you can see, there are duplications and also some nodes of the tree aren't showed at all. Thank everyone in advance!



Solution 1:[1]

If you call forEach, you should not modify the underlying array. All kinds of hard-to-understand behavior will result.

Solution 2:[2]

As mentioned by @JDB, you should not modify the underlying array in forEach.

Although you don't need to use forEach for BFS in this case as you are only traversing the tree. You can process one element at a time from the front of the queue until the queue is empty.

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)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 JDB
Solution 2 PR7