输入数据是一组构建二叉查找树的数据元素,你应该设计算法来实现转换过 程,并在多个测试数据上验证你的代码的准确性。 输出包括以下内容: (1)打印二叉查找树 (2)遍历二叉搜索树 (3)打印转换后的双链表 (4)按正反序输出双链表中的所有元素
时间: 2024-02-12 09:07:46 浏览: 32
好的,下面是实现算法的示例代码:
```python
class Node:
def __init__(self, val=None, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insert_bst(root, val):
if not root:
return Node(val)
if val < root.val:
root.left = insert_bst(root.left, val)
elif val > root.val:
root.right = insert_bst(root.right, val)
return root
def print_bst(root):
if not root:
return
print(root.val)
print_bst(root.left)
print_bst(root.right)
def inorder_traversal(node, head, tail):
if not node:
return tail
tail = inorder_traversal(node.left, head, tail)
if tail:
tail.right = node
else:
head = node
node.left = tail
tail = node
tail = inorder_traversal(node.right, head, tail)
return tail
def print_dll(head):
while head:
print(head.val)
head = head.right
def print_reverse_dll(tail):
while tail:
print(tail.val)
tail = tail.left
# 输入数据
data = [5, 3, 7, 1, 4, 6, 8]
# 构建二叉搜索树
root = None
for val in data:
root = insert_bst(root, val)
# 打印二叉搜索树
print("Binary Search Tree:")
print_bst(root)
print()
# 转换为双向链表
head = None
tail = None
tail = inorder_traversal(root, head, tail)
# 打印转换后的双向链表
print("Doubly Linked List:")
print_dll(head)
print()
# 按正序输出双向链表中的所有元素
print("Forward Order:")
print_dll(head)
print()
# 按反序输出双向链表中的所有元素
print("Reverse Order:")
print_reverse_dll(tail)
```
在这里,我们首先定义了一个 Node 类来表示二叉搜索树中的节点。然后,我们定义了一个 insert_bst 函数,该函数接收一棵二叉搜索树的根节点和一个值作为参数,并将该值插入到树中。如果根节点为空,则创建一个新节点并返回。如果该值小于根节点的值,则插入到左子树中。否则,插入到右子树中。然后,我们定义了一个 print_bst 函数,该函数接收一棵二叉搜索树的根节点作为参数,并通过前序遍历打印整棵树。
接下来,我们定义了一个 inorder_traversal 函数,该函数接收一棵二叉搜索树的根节点、头节点和尾节点作为参数,并将该树转换为双向链表。该函数使用中序遍历的方式遍历整棵树,并将每个节点插入到链表中。最后,该函数返回链表的尾节点。注意,该函数的头节点和尾节点是通过引用传递的。
然后,我们定义了一个 print_dll 函数,该函数接收链表的头节点作为参数,并通过遍历链表来打印所有元素。最后,我们定义了一个 print_reverse_dll 函数,该函数接收链表的尾节点作为参数,并通过遍历链表来按反序打印所有元素。
最后,我们使用给定的测试数据构建二叉搜索树,并进行遍历、转换和打印。