我々はいくつかの場所でroot.left
とroot.right
変数に関数呼び出しの結果を格納する必要がないのはなぜ再帰:関数に渡された変数を追跡して更新する必要がありますか?
Node deleteRec(Node root, int key)
{
/* Base Case: If the tree is empty */
if (root == null) return root;
/* Otherwise, recur down the tree */
if (key < root.key)
root.left = deleteRec(root.left, key);
else if (key > root.key)
root.right = deleteRec(root.right, key);
// if key is same as root's key, then This is the node
// to be deleted
else
{
// node with only one child or no child
if (root.left == null)
return root.right;
else if (root.right == null)
return root.left;
// node with two children: Get the inorder successor (smallest
// in the right subtree)
root.key = minValue(root.right);
// Delete the inorder successor
root.right = deleteRec(root.right, root.key);
}
return root;
}
を私はバイナリ検索ツリーからノードを削除するコードを行っていたと私は少し混乱しています? root
の値、つまり参照が関数に渡されているため、後続の呼び出しの変更によって自動的にツリーが更新されますが、そうではありませんか?なぜ変数に値を格納するのですか?以下の私のポイントを明確にするには、コード
// A recursive function used by topologicalSort
void topologicalSortUtil(int v, boolean visited[],
Stack stack)
{
// Mark the current node as visited.
visited[v] = true;
Integer i;
// Recur for all the vertices adjacent to this
// vertex
Iterator<Integer> it = adj[v].iterator();
while (it.hasNext())
{
i = it.next();
if (!visited[i])
topologicalSortUtil(i, visited, stack);
}
// Push current vertex to stack which stores result
stack.push(new Integer(v));
}
の別の部分は、スタックが関数に渡されると、我々はスタックは全体の更新を続けるだろうことを知っているので、我々は単にさらに関数呼び出しに何度も何度もそれを使用しています。ここでコール。
何か不足していますか間違ったことを理解しましたか?誰かが私の理解を助けてくれますか?ありがとう!!
"最も単純なケースは、削除されたノードがリーフの場合です。その場合、そのノードを指すリンクをnullに設定する必要があります。答えをありがとう。すべての答えは役に立ちましたが、この行は私にはっきりと分かりました。乾杯! – varunkr