用python中序遍历二叉搜索树 并输出,然后将其转换为双链表并输出,最后分别按正序和反序输出双链表中的所有元素
时间: 2024-02-12 20:09:20 浏览: 83
C语言实现链表
5星 · 资源好评率100%
好的,我可以为您解答这个问题。
首先,我们需要实现一个二叉搜索树。以下是一个简单的实现:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class BST:
def __init__(self):
self.root = None
def insert(self, val):
if not self.root:
self.root = TreeNode(val)
else:
current_node = self.root
while current_node:
if val < current_node.val:
if not current_node.left:
current_node.left = TreeNode(val)
break
current_node = current_node.left
else:
if not current_node.right:
current_node.right = TreeNode(val)
break
current_node = current_node.right
```
接下来,我们需要实现中序遍历。中序遍历的顺序是左子树、根节点、右子树。以下是一个递归实现:
```python
def inorder_traversal(root):
if not root:
return []
left = inorder_traversal(root.left)
right = inorder_traversal(root.right)
return left + [root.val] + right
```
现在我们已经可以输出二叉搜索树的中序遍历了。以下是一个示例:
```python
tree = BST()
tree.insert(5)
tree.insert(3)
tree.insert(7)
tree.insert(1)
tree.insert(4)
tree.insert(6)
tree.insert(8)
print(inorder_traversal(tree.root))
```
输出结果为:`[1, 3, 4, 5, 6, 7, 8]`。
接下来,我们需要将二叉搜索树转换为双链表。在转换过程中,我们需要保持树的中序遍历顺序不变。以下是一个实现:
```python
def convert_to_dll(root):
if not root:
return None, None
left_head, left_tail = convert_to_dll(root.left)
right_head, right_tail = convert_to_dll(root.right)
node = TreeNode(root.val)
if left_tail:
left_tail.right = node
node.left = left_tail
else:
left_head = node
if right_head:
right_head.left = node
node.right = right_head
else:
right_tail = node
return left_head, right_tail
```
`convert_to_dll` 函数返回双链表的头部和尾部节点。以下是将二叉搜索树转换为双链表的示例代码:
```python
head, tail = convert_to_dll(tree.root)
# 正序输出双链表
current = head
while current:
print(current.val, end=' ')
current = current.right
print()
# 反序输出双链表
current = tail
while current:
print(current.val, end=' ')
current = current.left
print()
```
输出结果为:`1 3 4 5 6 7 8` 和 `8 7 6 5 4 3 1`,分别为正序和反序输出的双链表中的所有元素。
阅读全文