📅  最后修改于: 2023-12-03 14:53:46.792000             🧑  作者: Mango
在二叉树的结构中,每个节点都有其左右子树,而我们有时需要将这些节点“展平”,也就是将其转换为链表的形式。这样可以更方便地遍历这些节点,也能够更容易地进行一些操作。
在本篇文章中,我们将学习如何将二叉树展平为链表。我们将基于递归的思想来解决这个问题。让我们开始吧!
给定一个二叉树,将其展开为一个单链表,其中这个链表的顺序就是二叉树的先序遍历结果。例如,如果给定二叉树为:
1
/ \
2 5
/ \ \
3 4 6
则展开后的链表应该为:
1 -> 2 -> 3 -> 4 -> 5 -> 6
我们将基于递归的思想来解决这个问题。具体的思路是:
我们可以看到,这种做法是基于先序遍历的思想。我们对于每一个节点,都是先对其左右子树进行操作,再对其本身进行操作。因此,我们最终展开出来的链表就是二叉树的先序遍历结果。
下面是使用 Java 实现的代码示例:
public class Solution {
public void flatten(TreeNode root) {
if (root == null) return;
flatten(root.left);
flatten(root.right);
TreeNode right = root.right;
root.right = root.left;
root.left = null;
while (root.right != null) {
root = root.right;
}
root.right = right;
return;
}
}
以上代码中,我们首先判断当前节点是否为空。如果为空,我们就停止遍历。如果不为空,我们先对其左子树进行展开,再对其右子树进行展开。然后,我们将右子树保存在一个变量 right
中,将左子树作为新的右子树,去掉当前节点的左子树,最后将右子树连接到右子树的末尾。
本文中,我们介绍了如何将二叉树展平为链表。通过基于递归的思想,我们将所有的节点展开,最终得到的链表就是二叉树的先序遍历结果。这种做法比较简单,但是需要我们仔细思考每一步的操作,才能够避免出现错误。