树状结构转换为链表结构

要递归地将树状结构转换为链表结构,我们需要遍历树的每个节点,并将它们按照一定的顺序(例如,前序、中序或后序)插入到链表中。以下是一个示例,展示了如何实现这种转换:

假设的树状结构定义

首先,我们定义一个简单的树状结构,每个节点包含一个值和指向子节点的指针。

#include <iostream>
#include <vector>
#include <memory>

// 树节点的定义
struct TreeNode {
    int value;
    std::vector<std::shared_ptr<TreeNode>> children;
    
    TreeNode(int val) : value(val) {}
};

链表节点的定义

接下来,我们定义链表节点,每个节点包含一个值和指向下一个节点的指针。

struct ListNode {
    int value;
    std::shared_ptr<ListNode> next;
    
    ListNode(int val) : value(val), next(nullptr) {}
};

转换函数的实现

我们需要一个辅助函数来递归地遍历树,并构建链表。这里使用前序遍历(即先处理当前节点,然后处理子节点)来实现转换。

std::shared_ptr<ListNode> convertTreeToList(const std::shared_ptr<TreeNode>& root) {
    if (!root) {
        return nullptr;
    }

    // 创建链表头节点
    auto head = std::make_shared<ListNode>(root->value);
    auto current = head;

    // 递归处理子节点
    for (const auto& child : root->children) {
        auto childList = convertTreeToList(child);
        if (childList) {
            current->next = childList;
            // 移动到链表的最后一个节点
            while (current->next) {
                current = current->next;
            }
        }
    }

    return head;
}

示例程序

最后,我们编写一个示例程序来测试树状结构到链表结构的转换。

int main() {
    // 构建一个简单的树状结构
    auto root = std::make_shared<TreeNode>(1);
    auto child1 = std::make_shared<TreeNode>(2);
    auto child2 = std::make_shared<TreeNode>(3);
    auto child3 = std::make_shared<TreeNode>(4);
    auto child4 = std::make_shared<TreeNode>(5);
    auto child5 = std::make_shared<TreeNode>(6);

    root->children.push_back(child1);
    root->children.push_back(child2);
    child1->children.push_back(child3);
    child1->children.push_back(child4);
    child2->children.push_back(child5);

    // 将树状结构转换为链表
    auto list = convertTreeToList(root);

    // 打印链表
    while (list) {
        std::cout << list->value << " ";
        list = list->next;
    }

    return 0;
}

解释

  1. 树状结构定义TreeNode 结构体定义了树节点,每个节点包含一个值和子节点列表。
  2. 链表结构定义ListNode 结构体定义了链表节点,每个节点包含一个值和指向下一个节点的指针。
  3. 转换函数convertTreeToList 函数递归地遍历树,并构建链表。它首先处理当前节点,然后递归处理子节点,并将结果链表连接起来。
  4. 示例程序:构建一个简单的树状结构,将其转换为链表,并打印链表的值。

这个示例展示了如何通过递归函数将树状结构转换为链表结构。可以根据需要调整遍历顺序和链表的构建方式,以满足特定的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值