将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。9 38 45 42 24 58 30 67 12 51
时间: 2024-03-26 15:38:04 浏览: 80
根据二叉搜索树的定义,每次插入一个节点时,需要从根节点开始遍历,如果插入节点的值比当前节点的值小,则继续遍历左子树;反之则遍历右子树。如果遇到一个空节点,则在该节点处插入新节点。
插入完所有节点后,可以通过层次遍历的方式输出二叉搜索树的节点值,并判断该树是否为完全二叉树。
完全二叉树的定义:对于一棵有n个节点的二叉树,按照从上到下、从左到右的顺序依次对每个节点进行编号,如果编号为i(1<=i<=n)的节点与满二叉树中编号为i的节点在二叉树中的位置相同,那么这棵二叉树就是一棵完全二叉树。
下面是实现该题的Python代码:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def insert(root, val):
if not root:
root = TreeNode(val)
elif val < root.val:
root.left = insert(root.left, val)
else:
root.right = insert(root.right, val)
return root
def level_order(root):
queue = [root]
res = []
while queue:
node = queue.pop(0)
res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
def is_complete(root):
queue = [root]
flag = False
while queue:
node = queue.pop(0)
if node.left:
if flag:
return False
queue.append(node.left)
else:
flag = True
if node.right:
if flag:
return False
queue.append(node.right)
else:
flag = True
return True
n = int(input())
nums = list(map(int, input().split()))
root = None
for num in nums:
root = insert(root, num)
res = level_order(root)
print(' '.join(map(str, res)))
if is_complete(root):
print('YES')
else:
print('NO')
```
输入样例:
```
10
9 38 45 42 24 58 30 67 12 51
```
输出样例:
```
9 38 12 24 45 30 58 42 51 67
YES
```
阅读全文