📜  将BST展平到排序列表|递减顺序(1)

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

将 BST 展平到排序列表 | 递减顺序

在二叉搜索树(BST)上,我们需要将节点展平为递减有序的序列,也就是将 BST 转换为一个排序的列表,使得每个节点的右子节点指向列表中的下一个节点,而左子节点为空。

解题思路

我们可以使用递归来实现二叉树的展平操作。假设当前节点为 root,则将 root 的右子树展平为有序的列表,并将其返回。然后,将 root 的左子树展平为有序的列表,并将其返回。最后,将 root 插入到左子树的末尾,然后返回整个有序列表即可。这里需要注意的是,root 右子树展平后返回的列表已经是递减有序的了,我们只需要将 root 插入到左子树的末尾即可。

具体实现方式请参考下面的代码片段。

代码实现

下面是 Python 代码实现:

class TreeNode:
    """
    Definition for a binary tree node.
    """
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if not root:
            return
        
        right = self.flatten(root.right)
        left = self.flatten(root.left)
        
        root.left = None
        root.right = left if left else right
        while left and left.right:
            left = left.right
        if left:
            left.right = right
        else:
            root.right = right
测试样例

下面给出一个测试样例,以帮助读者更好地理解以上思路。假设 BST 的结构如下所示:

    6
   / \
  2   8
 / \   \
0   4   9
   / \
  3   5

执行上述代码后,该 BST 将被转换为以下排序列表:

9 -> 8 -> 6 -> 5 -> 4 -> 3 -> 2 -> 0
总结

本文介绍了如何将 BST 展平为递减有序的序列。通过使用递归的方式,我们可以较为简单地实现该操作。具体而言,我们需要将 root 的右子树展平为有序列表,并将其返回;然后将 root 的左子树展平为有序列表,并将其插入到右子树的末尾;最后,将 root 插入到左子树的末尾,并返回整个有序列表即可。