c编程如何从树中获取叶子列表

我有一个二叉树,我需要列出所有的叶子

树定义是:

typedef struct tree { TreeNode* root; List leafList; } Tree; 

treeNode定义:

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

列表定义

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

}列表; listNode定义

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

在我的第一步,我建立了树(很好)。
现在,在我的第二步,我需要从所有叶子列出一个列表。 对于前 以下树将返回1-> 2-> 5-> 7的列表

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

这是我到目前为止所得到的

我的树构建器function:

 Tree BuildTreeFromArrayWithLeafList(int *arr, int size) { Tree T; T.root = BuildTreeRec(arr, size); // till here all working fine T.leafList.head = BuildLeafList(T.root); //function fail return T; } 

现在我的问题BuildLeafList函数需要构建树叶列表并返回它,但无论我如何更改我的代码它都会失败。 这是我的BuildLeafList函数代码:

 ListNode* BuildLeafList(TreeNode *tn) { ListNode *temp; if (tn == NULL) return; if (tn->left == NULL && tn->right == NULL) return CreateListNode(tn->data); temp = BuildLeafList(tn->left); temp->next = BuildLeafList(tn->right); return temp; } 

有人可以帮我做这个函数构建叶子列表并返回它。

这是它应该在树结构的最终图像中查看的方式

感谢任何帮助
提前致谢

回归’临时’是这里的问题。 当您从左子树更改为右子树时,最后一个节点将丢失。

节点6,temp == NULL,终止条件不满足,因此调用buildleaflist(tn-> left == 4)

节点4,temp == NULL,终止条件不满足,因此调用buildleaflist(tn-> left == 1)

节点1,temp == NULL,终止条件满足,因此节点被分配并返回到先前级别(节点4)。

节点4,temp-> data == 1,调用buildleaflist((tn-> right == 2)

节点2,temp == NULL,终止条件满足,因此节点被分配并返回到先前级别(节点4)。

节点4,temp-> next =(节点分配为2)。 列表看起来像1-> 2,temp指向1.节点4返回节点6。

节点6,temp-> data是1.调用buildleaflist(tn-> right == 3)。

节点3,temp == NULL,终止条件不满足,调用buildleaflist(tn-> left == 5)

节点5,temp == NULL,终止条件满足,因此分配节点并返回节点3。

节点3,temp-> data == 5,调用buildleaflist(tn-> right == 7)。

节点7,temp == NULL,终止条件满足,因此分配节点并返回节点3。

节点3,temp-> next =(节点7)。 因此列表(来自节点3的上下文)看起来像5-> 7。 节点3返回节点6。

问题在于此。 temp是节点6仍然指向’1’。 因此,当您执行temp-> next = buildleaflist(tn-> right)时,节点2会丢失。 该列表现在看起来像1-> 5-> 7。

我建议你传递一个双指针到buildleaflist(),它可以用来携带列表的头部。 然后,从buildleaflist()返回(temp-> next)。

 ListNode* BuildLeafList(TreeNode *tn, TreeNode **head) { ListNode *temp; if (tn == NULL) return; if (tn->left == NULL && tn->right == NULL) return CreateListNode(tn->data); temp = BuildLeafList(tn->left); if (*head == NULL) { *head = temp; } temp->next = BuildLeafList(tn->right); return temp->next; }