2014-10-31 64 views
-2

我不理解在下面的預序遍歷在預遍歷中如何實現遞歸?

void preorder(node*root) 

    { 
     if(root==NULL) return; 
     printf("%c",root->data); 
     preorder(root->left); 
     preorder(root->right); 
    } 

遞歸是迭代:

序(200) - >序(150) - >序(400) - >序(250) - >預訂(0)
即預訂(root-> left),它是NULL,它返回到下一條指令 - >預訂(0)
即預訂(root-> right)它返回

現在我的問題是爲什麼不遍歷尾部尾部呃這一步我不理解遞歸有人可以解釋一步一步迭代之後,這個步驟遞歸看起來很簡單,但在實現它是非常複雜的。

    ROOT[200] 
      200 F 
     /\ 
     / \ 
    150 C 350 D 
    /\  /\ 
    / \ / \ 
400 E 450 F 60 G 700 H 
/\   \ 
/ \   \ 
250 A 180 B  600 K 
+1

你的問題又是什麼?遞歸如何工作? – 2014-10-31 15:37:00

+1

目前還不清楚你在問什麼。 – kraskevich 2014-10-31 15:38:21

回答

2

我會爲你簡化它,給你上面提到的代碼和樹。

void preorder(node*root) 
    { 
     if(root==NULL) return; 
     printf("%c",root->data); 
     preorder(root->left); 
     preorder(root->right); 
    } 



     ROOT[200] 
      200 F 
     /\ 
     / \ 
    150 C 350 D 
    /\  /\ 
    / \ / \ 
400 E 450 F 60 G 700 H 
/\   \ 
/ \   \ 
250 A 180 B  600 K 

迭代是這樣的:NULL傳遞

preorder(200) 
preorder(200->Left) i.e. preorder(150) ---preorder(200->Right)--Pending In Stack- 
preorder(150->Left) i.e. preorder(400) ---preorder(150->Right)--Pending In Stack- 
preorder(400->Left) i.e. preorder(250) ---preorder(400->Right)--Pending In Stack- 
preorder(250->Left) i.e. preorder(NULL)---preorder(250->Right)--Pending In Stack- 

後,它會返回。下一個待處理的元素將被執行。

// In our case the function being called was 
preorder(250) 
{ 
    preorder(250->Left); // It returned. 
    preorder(250->Right); // Next Statement Pending in Stack. 
} 

以下是在棧未決聲明:

序(200->右鍵) - 等待在重新建立了新

序(150->右鍵) - 在之前重新建立了新

序(400->右鍵) - 等待在重新建立了新

序(250->右鍵) - 等待在重新建立了新

繼訂單後。接下來聲明出棧的是:

preorder(250->Right) i.e. preorder(NULL)--preorder(400->Right)--Pending In Stack- 

序(400->右)是函數的一部分:

preorder(400) 
{ 
    preorder(400->Left); // 250 
    preorder(400->Right); 
} 

現在既然400->左即250做了兩個 - >( 250->左)和(250->右)。它會將控制返回到(400->右)

類似地,遞歸將繼續進行直到整個樹被遍歷。我知道一開始很難理解,但不要放棄精神。從基本遞歸開始,嘗試自行提出解決方案。

+0

感謝您的幫助,現在事情是有道理的 – user4149541 2014-10-31 17:45:14

0

return語句結束當前函數的執行並將控制權返回給調用函數;執行繼續右邊下一個點後面的電話。它不會自動結束執行調用函數。