📅  最后修改于: 2023-12-03 15:39:20.144000             🧑  作者: Mango
在二叉树的基础上,我们还可以将其转化为双向链表。这样做的好处是,我们可以直接在链表中遍历二叉树的所有元素,而不需要再次构建二叉树。本文将介绍如何将给定的二叉树转换为双向链表,同时对主题进行第二次设置。
首先,我们先定义二叉树的结构体:
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;
}
这里我们定义了两个辅助函数concat
和treeToList
,其中concat
函数用于将两个双向链表合并,treeToList
函数用于将二叉树转化为双向链表。对于每一个节点,我们先递归遍历左右子树,然后构建新的双向链表。具体地,我们将左右子树转化为双向链表,然后将左链表、根节点和右链表通过concat
函数合并。最后,我们将左链表的头节点和右链表的尾节点相互连接,即可得到双向链表。具体实现可以参考代码。
本文介绍了如何将给定的二叉树转换为双向链表,同时对主题进行了第二次设置。具体实现中,我们采用了递归和指针的方法来实现,代码较为简洁。对于理解二叉树和链表的关系以及指针的使用,有较好的帮助作用。