General Tree

JavaScript

class Node {
  constructor(data) {
    this.value = data;
    this.children = new LinkedList();
    this.next = null;
  }
}

class LinkedList {
  constructor() {
    (this.head = this.tail = null), (this.size = 0);
  }

  append(node) {
    if (!this.tail) {
      this.tail = node;
      this.head = this.tail;
    } else {
      let oldTail = this.tail;
      this.tail = node;
      oldTail.next = this.tail;
    }
    this.size++;
  }
}

class Tree {
  constructor() {
    this.root = null;
    this.count = 0;
  }

  bfsFindNode(data) {
    let queue = [];
    queue.push(this.root);
    let node;

    while (queue.length > 0) {
      node = queue.shift();
      if (node.children.size > 0) {
        let currentNode = node.children.head;
        while (currentNode) {
          queue.push(currentNode);
          currentNode = currentNode.next;
        }
      }

      if (node.value === data) {
        return node;
      }
    }
    return false;
  }

  insert(data, parent) {
    let node = new Node(data);
    let parentNode;
    if (!this.root) {
      this.root = node;
      this.count++;
      return;
    }

    if (!parent) {
      console.log("please specify a parent");
      return;
    }

    parentNode = this.bfsFindNode(parent);

    if (!parentNode) {
      console.log("that node does not exist");
      return;
    }

    parentNode.children.append(node);
    this.count++;
  }

  contains(data) {
      let parentNode = this.bfsFindNode(data);
      if (parentNode) {
        return true;
      }
      return false;
  }

  print() {
    if (this.count) {
      let queue = [];
      queue.push(this.root);
      let node;
      while (queue.length > 0) {
        node = queue.shift();
        if (node.children.size > 0) {
          let currentNode = node.children.head;
          while (currentNode) {
            queue.push(currentNode);
            currentNode = currentNode.next;
          }
        }
        console.log(node.value);
      }
    }
  }

  size()...