📜  将给定的二叉树转换为双向链表 |设置 2(1)

📅  最后修改于: 2023-12-03 15:39:20.144000             🧑  作者: Mango

将给定的二叉树转换为双向链表 |设置 2
介绍

在二叉树的基础上,我们还可以将其转化为双向链表。这样做的好处是,我们可以直接在链表中遍历二叉树的所有元素,而不需要再次构建二叉树。本文将介绍如何将给定的二叉树转换为双向链表,同时对主题进行第二次设置。

代码实现

首先,我们先定义二叉树的结构体:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

接下来,我们定义一个函数来将二叉树转化为双向链表。

TreeNode* treeToList(TreeNode* root) {
    if (root == NULL) return NULL;
    TreeNode* left = treeToList(root->left);
    TreeNode* right = treeToList(root->right);
    root->left = root->right = root;
    return concat(concat(left, root), right);
}

TreeNode* concat(TreeNode* a, TreeNode* b) {
    if (a == NULL) return b;
    if (b == NULL) return a;
    TreeNode* aLast = a->left;
    TreeNode* bLast = b->left;
    aLast->right = b;
    b->left = aLast;
    a->left = bLast;
    bLast->right = a;
    return a;
}

这里我们定义了两个辅助函数concattreeToList,其中concat函数用于将两个双向链表合并,treeToList函数用于将二叉树转化为双向链表。对于每一个节点,我们先递归遍历左右子树,然后构建新的双向链表。具体地,我们将左右子树转化为双向链表,然后将左链表、根节点和右链表通过concat函数合并。最后,我们将左链表的头节点和右链表的尾节点相互连接,即可得到双向链表。具体实现可以参考代码。

总结

本文介绍了如何将给定的二叉树转换为双向链表,同时对主题进行了第二次设置。具体实现中,我们采用了递归和指针的方法来实现,代码较为简洁。对于理解二叉树和链表的关系以及指针的使用,有较好的帮助作用。