2013-05-26 29 views
0

我想在C中寫一個遞歸函數,它接收二叉樹中的根,並檢查是否存在等於給定總和的pathtoleaf。例如,它接收在下列樹中的第一個節點:找到等於總和的葉子的路徑(非BST)

  1 

    2    3 

5  10  4 20 

          2 

以下是PathToLeaf的例子:

  • 1⟶2⟶10
  • 2⟶5
  • 20⟶2

The followi納克不PathToLeaf:

  • 1⟶2
  • 1⟶3⟶20

如果路徑存在,則該函數將返回1;如果不是,則返回0.

在這棵樹中,如果sum = 12,那麼函數應該返回1,因爲路徑2⟶10;如果sum = 4,那麼函數應該返回0,因爲唯一路徑(1⟶3)不會以葉結尾。

這裏我最大的問題是我只能管理一個檢查roottoleaf路徑的函數。

+0

而不是一個單一的總和,管理一組總和。當你訪問一個節點時,(1)向當前集合中插入0,(2)將節點的值添加到集合中的所有元素(如算法中)。訪問節點的新孩子的孩子。 –

回答

1

如果你有一個功能roottoleaf(const BST *tree, int target),你的pathtoleaf(const BST *tree, int target)功能很容易,不是嗎,使用適當的遍歷樹?

int pathtoleaf(const BST *tree, int target) 
{ 
    if (roottoleaf(tree, target)) 
     return 1; 
    else if (pathtoleaf(tree->left, target)) 
     return 1; 
    else if (pathtoleaf(tree->right, target)) 
     return 1; 
    else 
     return 0; 
} 
+0

我需要它作爲遞歸函數,我們不在BST上工作,樹是未排序的 – user2422190

+0

稱它爲ST而不是BST,或者B代表Binary而不是Balanced。這是一種數據類型;它的名字並不重要。我明確假設的唯一的事情是它包含成員'left'和'right',它們指向樹的下一層;絕對沒有關於排序或平衡的假設(只是樹是二元的;一個節點最多有兩個孩子)。你可以通過展示你的所得來幫助你。我已經修復了它對您的缺乏遞歸性(修復了一個bug!);它需要爲子樹調用自己。 –

+0

現在測試的代碼;它適用於我的'roottoleaf()'函數,這是我實現中的14行代碼(包括定義行,開放和關閉花括號)。 –

相關問題