c编程如何从树

时间:2017-01-09 06:10:42

标签: c

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

树的定义是:

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

treeNode define:

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

列出定义

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

}列表; listNode define

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;
}

有人可以帮我制作这个函数构建叶子列表并将其返回。

这就是它最终应该如何看待 image of tree struct

感谢任何帮助 提前致谢

1 个答案:

答案 0 :(得分:0)

返回'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->数据为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;
}