C二叉树,如何从树叶制作列表

时间:2017-01-09 13:10:15

标签: c algorithm

我需要建立树中所有树叶的列表 例如,我有以下树:

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

treeNode typedef

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

我的列表应为1-> 2-> 5-> 7

列出typedef

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

listNode typedef

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

Listnode-> data = TreeNode-> data; (listnode结构数据)

该函数应该是通用的,我累了几个递归函数但没有工作

有什么想法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

基本思想是遍历树in-order,并将遇到的每个叶节点推送到列表中。如下所示:

int main()
{
    Server srv(PORT);
    if (srv.server_create()) {
        std::cout << "Server bind!\n";
        srv.server_run();
    }
    else {
        std::cout << "Bind fail! ERRNO: "<<errno<<"\n";
        return -1;
    }
    return 0;
}

答案 1 :(得分:0)

您可以尝试使用递归来完成此操作。你要做的是首先检查你是否已经到达叶子节点,即。如果左右指针为NULL,则在这种情况下将节点添加到列表中。伪代码如下所示:

getLeavesList(root) {
    if root is NULL: return
    if root is leaf_node: add_to_leaves_list(root)
    getLeavesList(root -> left)
    getLeavesList(root -> right)
}

您可以将此代码改编为任何编程语言。因此,如果root为NULL,那么,如果函数没有收到有效指针,则返回错误消息。如果根是叶子,那么,如果左子节点和右子节点都是NULL,则必须将其添加到叶节点列表中。然后,您使用左右子节点递归调用该函数。