Первый шаг вглубь с бинарным деревом поиска

#javascript

Вопрос:

Я пытаюсь получить результаты Depthfirsttraverself для бинарного дерева поиска. Но я получаю результат Бланко.

Итак, у меня есть это:

 
class BST {
  constructor(value) {
    this.left = null;
    this.right = null;
    this.value = value;
  }

  insert(value) {
    if (value <= this.value) {
      if (!this.left) this.left = new BST(value);
      else this.left.insert(value);
    } else if (value > this.value) {
      if (!this.right) this.right = new BST(value);
      else {
        this.right.insert(value);
       
      }
    }
  }


  depthFirstTraversel = (iteratorFunc) => {    
    if (this.left) this.left.depthFirstTraversel(iteratorFunc);  
    if (this.right) this.right.depthFirstTraversel(iteratorFunc);
  };
}

function log(value) {
  console.log(value);
}

const bst = new BST(50);
bst.insert(30);
bst.insert(70);
bst.insert(100);
bst.insert(60);
bst.insert(59);
bst.insert(20);
bst.insert(45);
bst.insert(35);
bst.insert(85);
bst.insert(105);
bst.insert(10);




bst.depthFirstTraversel(log);
 

Итак, я ожидаю, что числа будут в порядке возрастания: 10 20 30..и т. Д

Но я получаю страницу Бланко в инструментах для разработки Google chrome

Комментарии:

1. Вы никогда на самом деле не вызываете свой iteratorFunc ( т. Е. вход в вашем случае), а просто переходите к следующему узлу …

Ответ №1:

Ваш depthFirstTraversel не пытается ничего выводить, все, что он делает, — это пересекает. По какой-то причине вы продолжаете передавать log функцию в качестве параметра, но никогда не вызываете ее.

Вот исправленная версия (я удалил передачу функции журнала в качестве параметра, потому что ее можно просто вызвать напрямую.)

 class BST {
  constructor(value) {
    this.left = null;
    this.right = null;
    this.value = value;
  }

  insert(value) {
    if (value <= this.value) {
      if (!this.left) this.left = new BST(value);
      else this.left.insert(value);
    } else if (value > this.value) {
      if (!this.right) this.right = new BST(value);
      else {
        this.right.insert(value);
       
      }
    }
  }


  depthFirstTraversel = () => {    
    if (this.left) this.left.depthFirstTraversel();  
    log(this.value);
    if (this.right) this.right.depthFirstTraversel();
  };
}

function log(value) {
  console.log(value);
}

const bst = new BST(50);
bst.insert(30);
bst.insert(70);
bst.insert(100);
bst.insert(60);
bst.insert(59);
bst.insert(20);
bst.insert(45);
bst.insert(35);
bst.insert(85);
bst.insert(105);
bst.insert(10);




bst.depthFirstTraversel(log); 

Комментарии:

1. эх, спасибо тебе. Но результат оказался не таким, как я ожидал. То, что я сказал, должно быть: в порядке возрастания, так что: 10, 20, 30 и т. Д

2. Вы спросили, почему он не производит никакой продукции, вот что я ответил.

3. Но также и результат. это тоже то, о чем я спрашивал.

4. Чтобы иметь его в порядке возрастания, вам на самом деле нужно будет вывести значение после обхода левого, но перед переходом к правому дочернему элементу

5. Спасибо @derpischer, я внес это изменение