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