A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Each input file contains one test case. For each case, the first line contains a positive integer $N (\leqslant 1000)$. Then $N$ integer keys are given in the next line. All the numbers in a line are separated by a space.
For each test case, first print in a line YES
if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or NO
if not. Then if the answer is YES
, print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
7
8 6 5 7 10 8 11
YES
5 7 6 8 11 10 8
7
8 10 11 8 6 7 5
YES
11 8 10 7 5 6 8
7
8 6 8 5 10 9 11
NO
本题 25 分,考察的是二叉搜索树的影用,难度较大,对树的理解有极大帮助。
注意,使用 Python 做树相关的题目时,可能会出现“非零返回”的错误提示。这可能是因为 Python 解释器的默认递归深度有限,测试样例的数据超过了默认的1000,手动设置递归深度为一个较大的数即可。
import sys
sys.setrecursionlimit(5000)
import sys
sys.setrecursionlimit(5000)
class BTNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class BST():
def insert(self, root, val):
if root == None:
root = BTNode(val)
elif val < root.val:
root.left = self.insert(root.left, val)
else:
root.right = self.insert(root.right, val)
return root
def pre_order(self, root, lst):
if root == None: return
lst.append(root.val)
self.pre_order(root.left, lst)
self.pre_order(root.right, lst)
def post_order(self, root, lst):
if root == None: return
self.post_order(root.left, lst)
self.post_order(root.right, lst)
lst.append(root.val)
def pre_order_mirror(self, root, lst):
if root == None: return
lst.append(root.val)
self.pre_order_mirror(root.right, lst)
self.pre_order_mirror(root.left, lst)
def post_order_mirror(self, root, lst):
if root == None: return
self.post_order_mirror(root.right, lst)
self.post_order_mirror(root.left, lst)
lst.append(root.val)
count = int(input())
seq = list(map(int, input().split()))
bt = BST()
tree = None
pre_seq = []
pre_seq_mirror = []
post_seq = []
for val in seq:
tree = bt.insert(tree, val)
bt.pre_order(tree, pre_seq)
bt.pre_order_mirror(tree, pre_seq_mirror)
if seq == pre_seq:
bt.post_order(tree, post_seq)
print('YES')
print(' '.join(map(str, post_seq)))
elif seq == pre_seq_mirror:
bt.post_order_mirror(tree, post_seq)
print('YES')
print(' '.join(map(str, post_seq)))
else:
print('NO')
https://qsctech-sange.github.io/1043-Is-It-a-Binary-Search-Tree.html#%E4%BB%A3%E7%A0%81
https://docs.python.org/zh-cn/3.8/library/sys.html#sys.setrecursionlimit