我正在經歷從二叉搜索樹刪除節點的代碼,我有點糊塗了遞歸:傳遞給函數的變量是否需要跟蹤和更新?
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.left
和root.right
變量在幾個地方調用?由於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));
}
這裏堆被傳遞給函數,我們只是一遍又一遍用它在進一步的函數調用,因爲我們知道,堆棧將繼續跨越更新調用。
我錯過了什麼,或者我明白了什麼錯?有人可以幫助我理解。謝謝 !!
」最簡單的情況是當刪除的節點是葉:在這種情況下,指向它的鏈接必須設置爲空。「感謝你的回答。所有的答案都很有幫助,但是這條線讓我很清楚。乾杯! – varunkr