2017-01-09 52 views
-1

我需要建立在樹上所有的葉子列表
例如,我有以下三種:C二元樹,如何從樹上使列表離開

6 
/\ 
    4 3 
/\ /\ 
1 2 5 7 

treeNode的typedef的

typedef struct treeNode { 
    int data; 
    struct treeNode* parent; 
    struct treeNode* left; 
    struct treeNode* right; 
} TreeNode; 

我的列表應該1-> 2-> 5-> 7

列表的typedef

typedef struct list { 
     ListNode* head; 
     ListNode* tail; 
    } List; 

listNode的typedef

typedef struct listNode { 
     int data; 
     struct listNode* next; 
    } ListNode; 

Listnode->數據= TreeNode->數據; (該listnode結構數據)

的功能應該是通用的,我累了幾個遞歸函數,但沒有工作

任何想法? 在此先感謝。

+0

做有序遍歷並檢查葉節點。 – letmutx

+3

嘗試另一個遞歸函數。這是自然的走向。也許你可以發佈你最好的嘗試,並描述它是如何失敗的。 –

+5

你是不是隻是同一所學院的學生,不喜歡做自己的作業? http://stackoverflow.com/questions/41541946/c-programming-how-to-get-list-of-leaves-from-tree – StoryTeller

回答

4

基本思路是遍歷樹in-order,並將遇到的每個葉節點推送到列表中。類似以下內容:

populateList(node) 
    if(node == null) return 

    populateList(node->left) 

    if (node->left == null && node->right == null) 
    pushToList(node) 
    return 

    populateList(node->right) 
+0

我也這樣做了,但我的問題是將新列表返回給refferer函數 – Bglen

0

這可以通過遞歸來完成,就像您嘗試的那樣。你需要做的是首先檢查你是否已經到達葉節點,即。如果左指針和右指針是NULL,那麼您將該節點添加到列表中。僞代碼如下所示:

getLeavesList(root) { 
    if root is NULL: return 
    if root is leaf_node: add_to_leaves_list(root) 
    getLeavesList(root -> left) 
    getLeavesList(root -> right) 
} 

可以將此代碼適應任何編程語言。所以,如果根是NULL,這是,如果該函數沒有收到有效的指針,則返回一條錯誤消息。如果根是一片葉子,這就是說,如果左邊和右邊的子節點都是NULL,則必須將它添加到葉節點列表中。然後你用左右子節點遞歸地調用函數。