Recursion 코드를 Implementation으로 고치려고 하는데

dmsguswns의 이미지

Datastructures를 공부 중인 학생인데요,

수업시간에 Tail Recursion을 Implemetation으로 바꿔보라는데 한참을 헤매다 결국 못했는데요,

보통 While로 고쳐서 쉽게 하던데 머리 속으로 생각해서 할려니 복잡해지기만하고, 해결이 안되서요..

밑에 두 개 였는데, Binary Search Tree 중 internal insert와 delete에 해동하는 부분이구요,

어떻게 해야하는거죠? (혹시 몰라 전체 소스 첨부해요)

/* (P7-4)==================== _insert ====================
This function uses recursion to insert the new data
into a leaf node in the BST tree.
Pre Application has called BST_Insert, which
passes root and data pointer
Post Data have been inserted
Return pointer to [potentially] new root
*/
NODE* _insert (BST_TREE* tree, NODE* root, NODE* newPtr)
{
// Statements
if (!root)
// if NULL tree
return newPtr;

// Locate null subtree for insertion
if (tree->compare(newPtr->dataPtr,
root->dataPtr) < 0)
{
root->left = _insert(tree, root->left, newPtr);
return root;
} // new < node
else
// new data >= root data
{
root->right = _insert(tree, root->right, newPtr);
return root;
} // else new data >= root data
return root;
} // _insert

/* (P7-6)==================== _delete ====================
Deletes node from the tree and rebalances
tree if necessary.
Pre tree initialized--null tree is OK.
dataPtr contains key of node to be deleted
Post node is deleted and its space recycled
-or- if key not found, tree is unchanged
Return success is true if deleted; false if not found
pointer to root
*/
NODE* _delete (BST_TREE* tree, NODE* root,
void* dataPtr, bool* success)
{
// Local Definitions
NODE* dltPtr;
NODE* exchPtr;
NODE* newRoot;
void* holdPtr;

// Statements
if (!root)
{
*success = false;
return NULL;
} // if

if (tree->compare(dataPtr, root->dataPtr) < 0)
root->left = _delete (tree, root->left,
dataPtr, success);
else if (tree->compare(dataPtr, root->dataPtr) > 0)
root->right = _delete (tree, root->right,
dataPtr, success);
else
// Delete node found--test for leaf node
{
dltPtr = root;
if (!root->left)
// No left subtree
{
free (root->dataPtr); // data memory
newRoot = root->right;
free (dltPtr); // BST Node
*success = true;
return newRoot; // base case
} // if true
else
if (!root->right)
// Only left subtree
{
newRoot = root->left;
free (dltPtr);
*success = true;
return newRoot; // base case
} // if
else
// Delete Node has two subtrees
{
exchPtr = root->left;
// Find largest node on left subtree
while (exchPtr->right)
exchPtr = exchPtr->right;

// Exchange Data
holdPtr = root->dataPtr;
root->dataPtr = exchPtr->dataPtr;
exchPtr->dataPtr = holdPtr;
root->left =
_delete (tree, root->left,
exchPtr->dataPtr, success);
} // else
} // node found
return root;
} // _delete

File attachments: 
첨부파일 크기
Package icon Ch07BST.zip10.4 KB
익명 사용자의 이미지

여기가 숙제해주는곳인가요?.............;;

익명 사용자의 이미지

iteration으로 바꾸는 것이 아닌가?

madhatter의 이미지

그림으로 그리거나 재귀 과정을 풀어서 써 보시죠. tail recursion 이면 iteration 으로 바꾸기 어렵지 않은데요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.