我有一个二叉树,我需要列出所有叶子
树的定义是:
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
感谢任何帮助 提前致谢
答案 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;
}