2012-09-17 69 views
4

我已經回到K & R以讀取一章,並注意到我以前省略過的一個例子。 本章涵蓋了二叉樹數據類型的主題。我知道在節點中存儲新條目,但打印功能讓我感到困惑。爲什麼要先打印左邊的部分?二叉樹元素的遞歸printf

它會工作,如果printf將是第一個命令的功能,其次是左和右?

如果不是 - 爲什麼呢?

/* treeprint: in-order print of tree p */ 
void treeprint(struct tnode *p) 
{ 
    if (p != NULL) { 
     treeprint(p->left); 
     printf("%4d %s\n", p->count, p->word); 
     treeprint(p->right); 
    } 
} 
+0

https://en.wikipedia.org/wiki/Inorder#Depth-first_traversal – sigjuice

回答

9

首先下降左側,然後打印節點本身,然後下降右側,這是操作有序樹遍歷。如果您在左下降之前移動了printf,如您所建議的那樣,將使其預訂遍歷。如果你先做了兩次下降,那將是後續訂單。所有三種可能性訪問所有節點,但是以三種不同的順序。

考慮簡單的樹

* 
/\ 
a + 
/\ 
    b c 

如果你遍歷這棵樹在預購你

* a + b c 

在階,

a * b + c 

後順序,

a b c + * 

你想要想要這些可能性取決於你在做什麼。

1

當然它會「工作」。你只需要輸出一個不同的順序。您也可以在兩個子節點之後打印節點。 (和想象一下,如果你有多個孩子樹而不是兩個。)

真正的問題是值樹節點的是否遵守任何特殊的規則,因此無論任何特定的遍歷順序是特別有意義的。例如,對於binary search tree,左側自我自動訂單按排序順序打印出值。

0

您可以通過不同的方式遍歷二叉樹:預訂,按序和後序。

printf可能是一個完全不同的過程(計算節點數據)。有些問題需要在樹上行走的方式有所不同,例如,如果要平衡二叉樹,則可在訪問兩個子樹後計算平衡因子。

因此,printf可以被認爲是處理不同類型問題的其他類型程序/函數的佔位符。