📅  最后修改于: 2023-12-03 15:39:13.880000             🧑  作者: Mango
在二叉搜索树(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 插入到左子树的末尾,并返回整个有序列表即可。