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):X用

//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 X:0、Y:0
  • ノード:20×:-1 Y:-1
  • ノード:10 X: -2 Y:-2
  • ノード:30 X:0、Y:-2
  • ノード:60 X:1 Y:-1
  • ノード:55 X:0、Y:-2
  • ノード:70 X:2 Y:-2
  • ノード:65 X:1 Y:-3
  • ノード:80×:3 Y:-3

出力が正確であるが、このパラメータがどのように再帰で渡され、直感的ではないかと感じる結果でした。誰かが私に何が起こっているのかを明確にすることができますか?これについてもっと直感的な方法がありますか?

+0

ように私は、パラメータとしてインクリメンタのあなたの奇妙な使用に問題が発生したノードは、同じ「座標」を持つことができるので、

xは、誤解を招くおそれがあります。 –

+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はゼロ以下になります。

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

提案するだけで、最初から各ノードに0を付け、同じレベルの各ノードについて最初に増分してから次のレベルに進むときに、すべてのノードに数値表現を付けることができます。レベル0は0、レベル1はノード番号1と2、レベル2は3,4,5,6、sndなどとなります。 –

+0

助けてくれてありがとう!この場合、リテラルの操作と比較して増分/減分に関する動作に違いがある理由はありますか?また、私はxが何であるかを再定義しなければならないように見えます。おそらくあなたの提案に沿っています。 – insertmike

関連する問題