1

У меня есть следующая функция для вычисления координат для каждого узла в двоичном дереве.Координаты каждого узла в двоичном дереве?

//x & y parameters should be untouched 
//root assumed to be 0,0 
function nodeCoordinates(node, x, y) 
{ 

    if (x === undefined && y === undefined) {x = 0; y = 0;} 
    if (!node) {return;} 

    console.log("Node: " + node.value + " x: " + x + " y: " + y); 
    nodeCoordinates(node.left, --x, --y); 
    nodeCoordinates(node.right, x+=2, y--); 

} 

узла и дерева (BST):

//Nodes for BST 
function Node(val) { 
    this.value = val; 
    this.left = null; 
    this.right = null; 
} 

//Binary Search Tree 
function BST() { 

    this.root = null; 

} 

Для х, он должен уменьшать, если он пойдет налево. приращение, если оно идет правильно.

Для y, он должен уменьшаться, когда он опускается вниз.

Пример тестового кода и выход:

my_BST.insert(50); 
my_BST.insert(60); 
my_BST.insert(55); 
my_BST.insert(20); 
my_BST.insert(70); 
my_BST.insert(80); 
my_BST.insert(10); 
my_BST.insert(30); 
my_BST.insert(65); 
nodeCoordinates(my_BST.root); 
  • Узел: 50 х: 0 у: 0
  • Узел: 20 х: -1 у: -1
  • Узел: 10 х: -2 у: -2
  • Узел: 30 х: 0 у: -2
  • Узел: 60 х: 1 г: -1
  • Узел: 55 х: 0 у: -2
  • Узел: 70 х: 2 у: -2
  • Узел: 65 х: 1 у: -3
  • Узел: 80 х: 3 у: -3

Выходной сигнал является правильным, но это был результатом возиться с тем, как параметры передаются с рекурсией, и это кажется неинтуитивным. Может кто-нибудь помочь мне уточнить, что происходит? Есть ли более интуитивный способ сделать это?

+0

У меня есть проблемы с странного использования incrementers в качестве параметров. –

+0

Ehh. Это не самый обычный способ сохранить ценности, но это довольно удобно. – insertmike

ответ

1

Я бы изменил обработку параметров без использования операторов присваивания или приращения.

function nodeCoordinates(node, x, y) { 
    x = x || 0; 
    y = y || 0; 
    if (!node) { 
     return; 
    } 
    console.log("Node: " + node.value + " x: " + x + " y: " + y); 
    nodeCoordinates(node.left, x - 1, y - 1); 
    nodeCoordinates(node.right, x + 1, y - 1); 
} 

В основном y является уровень дерева, с опускается ниже нуля.

x вводит в заблуждение, поскольку узлы могут иметь одинаковые «координаты», как

Node: 30 x: 0 y: -2 
Node: 55 x: 0 y: -2 
+0

просто предложение, вы можете обратиться к каждому узлу с числовым представлением при нумерации каждого узла с нуля с нулем и приращением для каждого узла на одном уровне сначала, а затем перейти на следующий уровень. например, уровень 0 равен 0, уровень 1 имеет номер узла 1 и 2, уровень 2 имеет 3, 4, 5, 6, snd и так далее. –

+0

Спасибо за помощь! Есть ли причина, по которой разница в поведении относительно приращений/декретов по сравнению с операциями с литералами в этом случае? Кроме того, да, похоже, что мне нужно переопределить, что такое x, возможно, вместе с вашим предложением. – insertmike