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

c语言编程如何从树中获取树叶列表,c,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 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;
}名单; 列表节点定义

typedef struct listNode {
    int data;
    struct listNode* next;
} ListNode;
我第一步就造了这棵树(很好)。
现在,在我的第二步中,我需要从所有的叶子中列出一个列表。 例如,下面的树将返回1->2->5->7的列表

    6
   / \
  4   3
 /\   /\
1  2 5  7
这就是我目前得到的

我的树生成器功能:

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;
}
有人能帮我建立这个函数的叶子列表,并返回它

这就是它最终的样子

感谢您的帮助

提前感谢

这里的问题是返回“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

我建议您将一个双指针传递给buildLeapList(),它可以用来携带列表的标题。然后,从buildLeapList()返回(temp->next)


请发布所有代码,不要对其进行编辑(BuildList vs BuildLeafList)。我们不知道您是如何构建树的,如何确保它是正确的?我们不知道您得到了什么,函数失败的原因是什么?您还忘记在列表中为不是树中叶子的节点创建节点…您没有指出您的问题是什么,或者您的问题是什么。我只是重命名了它,我仍在尝试解决我的问题,但我没有注意到我的问题重新定义我的函数,但这不是我问题的原因,函数仍然保持不变failing@StephenRauch我需要BuildLeapList函数来返回树叶列表,但它不会。这是我的问题。为什么不做一个普通的有序递归,然后检查
LeapList==NULL
来确定节点是否是树叶?
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;
}