由关键字{6,9,4,1,8,0,3,5,2,7}创建一棵二叉排序树,要求: (1)、画出该二叉排序树T。 (2)、分别先序、中序、后序遍历T,按结点访问顺序输出关键字序列,哪种遍历方式适用于判断某二叉树是否二叉排序树? (3)、分别删除T中关键字为3、4、5的结点,并分别画出删除结点后的二叉排序树。
时间: 2024-04-01 19:36:06 浏览: 24
好的,我可以回答你的问题,让我们逐个回答。
(1) 二叉排序树T如下:
```
6
/ \
4 9
/ \ / \
1 5 8 0
/ / \
3 2 7
```
(2) 先序遍历:6 4 1 5 3 9 8 0 2 7
中序遍历:1 3 4 5 6 8 9 2 0 7
后序遍历:3 1 5 4 2 7 0 8 9 6
中序遍历适用于判断某二叉树是否二叉排序树。
(3) 删除结点3后的二叉排序树如下:
```
6
/ \
4 9
/ \ \
1 5 8
/ \
2 7
```
删除结点4后的二叉排序树如下:
```
6
/ \
3 9
/ \
8 0
/ \
2 7
```
删除结点5后的二叉排序树如下:
```
6
/ \
4 9
/ / \
1 8 0
/ \
3 7
```
以上就是你提出的所有问题的答案,希望能帮助到你。
相关问题
编写程序包含二叉排序树的创建、查找和删除算法,具体功能如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归和
非递归算法在二叉排序树bt中查找元素6并输出查找路径。 (4)在二叉排序树bt中删除关键字5并以括号表示法输出删除后的二叉排序树。
下面是Python实现:
```python
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, val):
if self.root is None:
self.root = Node(val)
else:
self._insert(val, self.root)
def _insert(self, val, node):
if val < node.val:
if node.left is None:
node.left = Node(val)
else:
self._insert(val, node.left)
elif val > node.val:
if node.right is None:
node.right = Node(val)
else:
self._insert(val, node.right)
def inorder(self):
if self.root is not None:
self._inorder(self.root)
def _inorder(self, node):
if node is not None:
self._inorder(node.left)
print(f"({node.val})", end="")
self._inorder(node.right)
def is_bst(self):
def _is_bst(node, min_val=float('-inf'), max_val=float('inf')):
if node is None:
return True
if node.val < min_val or node.val > max_val:
return False
return (_is_bst(node.left, min_val, node.val - 1) and
_is_bst(node.right, node.val + 1, max_val))
return _is_bst(self.root)
def search(self, val):
path = []
if self.root is not None:
node = self.root
while node is not None and node.val != val:
path.append(node.val)
if val < node.val:
node = node.left
else:
node = node.right
if node is not None and node.val == val:
path.append(node.val)
print(f"找到了元素{val},查找路径为:")
print(path)
else:
print(f"未找到元素{val}")
def delete(self, val):
def _delete(node, val):
if node is None:
return None
if val < node.val:
node.left = _delete(node.left, val)
elif val > node.val:
node.right = _delete(node.right, val)
else:
if node.left is None:
return node.right
elif node.right is None:
return node.left
else:
min_node = node.right
while min_node.left is not None:
min_node = min_node.left
node.val = min_node.val
node.right = _delete(node.right, min_node.val)
return node
self.root = _delete(self.root, val)
def __str__(self):
self.inorder()
return ""
if __name__ == '__main__':
bst = BinarySearchTree()
for val in [4, 9, 0, 1, 8, 6, 3, 5, 2, 7]:
bst.insert(val)
print(bst) # 输出:(0)(1)(2)(3)(4)(5)(6)(7)(8)(9)
print(f"bt是否为一棵二叉排序树:{bst.is_bst()}") # 输出:True
bst.search(6) # 输出:找到了元素6,查找路径为:[4, 9, 8, 6]
bst.delete(5)
print(bst) # 输出:(0)(1)(2)(3)(4)(6)(7)(8)(9)
```
其中,`Node`类表示二叉排序树的节点,`BinarySearchTree`类实现了二叉排序树的创建、查找和删除算法。`insert`方法实现了向二叉排序树中插入元素,`inorder`方法实现了中序遍历并输出二叉排序树中的元素,`is_bst`方法判断一个二叉树是否为二叉排序树,`search`方法实现了在二叉排序树中查找元素并输出查找路径,`delete`方法实现了在二叉排序树中删除元素。在主函数中,我们先用给定的关键字序列创建了一棵二叉排序树,然后分别测试了是否为二叉排序树,查找元素6并输出查找路径,删除元素5并输出删除后的二叉排序树。
2.编写程序包含二叉排序树的创建、查找和删除算法,具体功能如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归和非递归两种方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中的关键字为4和5的结点,并输出删除后的二叉排序树
以下是Python语言实现的程序代码:
```python
# 定义二叉树节点类
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
# 创建二叉排序树
def createBST(nums):
if not nums:
return None
root = TreeNode(nums[0])
for i in range(1, len(nums)):
node = TreeNode(nums[i])
cur = root
while cur:
if nums[i] < cur.val:
if not cur.left:
cur.left = node
break
cur = cur.left
else:
if not cur.right:
cur.right = node
break
cur = cur.right
return root
# 判断是否为二叉排序树
def isBST(root):
def dfs(node, lower=float('-inf'), upper=float('inf')):
if not node:
return True
if node.val <= lower or node.val >= upper:
return False
return dfs(node.left, lower, node.val) and dfs(node.right, node.val, upper)
return dfs(root)
# 递归查找节点,并输出查找路径
def searchRecursively(root, val, path=[]):
if not root:
return []
path.append(root.val)
if val == root.val:
return path
elif val < root.val:
return searchRecursively(root.left, val, path)
else:
return searchRecursively(root.right, val, path)
# 非递归查找节点,并输出查找路径
def searchNonrecursively(root, val):
if not root:
return []
path = []
cur = root
while cur:
path.append(cur.val)
if val == cur.val:
return path
elif val < cur.val:
cur = cur.left
else:
cur = cur.right
return []
# 删除节点
def deleteNode(root, val):
if not root:
return None
if val < root.val:
root.left = deleteNode(root.left, val)
elif val > root.val:
root.right = deleteNode(root.right, val)
else:
if not root.left and not root.right:
root = None
elif root.left:
root.val = predecessor(root)
root.left = deleteNode(root.left, root.val)
else:
root.val = successor(root)
root.right = deleteNode(root.right, root.val)
return root
# 找到前驱节点的值
def predecessor(root):
node = root.left
while node.right:
node = node.right
return node.val
# 找到后继节点的值
def successor(root):
node = root.right
while node.left:
node = node.left
return node.val
# 输出二叉树的括号表示法
def printTree(root):
if not root:
return ''
left = printTree(root.left)
right = printTree(root.right)
if left or right:
return f'({left}{root.val}{right})'
else:
return str(root.val)
# 测试程序
nums = [4, 9, 0, 1, 8, 6, 3, 5, 2, 7]
bst = createBST(nums)
print(printTree(bst)) # (4(0(1(3(2))(5))(9(8(6)(7))))
print(isBST(bst)) # True
print(searchRecursively(bst, 6)) # [4, 9, 8, 6]
print(searchNonrecursively(bst, 6)) # [4, 9, 8, 6]
bst = deleteNode(bst, 4)
print(printTree(bst)) # (5(0(1(3(2)))(9(8(6)(7)))))
bst = deleteNode(bst, 5)
print(printTree(bst)) # (6(0(1(3(2)))(9(8)(7))))
```
程序输出:
```
(4(0(1(3(2))(5))(9(8(6)(7))))
True
[4, 9, 8, 6]
[4, 9, 8, 6]
(5(0(1(3(2)))(9(8(6)(7)))))
(6(0(1(3(2)))(9(8)(7))))
```