华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)
题目描述
定义构造三叉搜索树规则如下:
每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:
如果数小于节点的数减去500,则将数插入节点的左子树
如果数大于节点的数加上500,则将数插入节点的右子树
否则,将数插入节点的中子树
给你一系列数,请按以上规则,按顺序将数插入树中,构建出一棵三叉搜索树,最后输出树的高度。
输入描述
第一行为一个数 N,表示有 N 个数,1 ≤ N ≤ 10000
从第二行开始输入N行,每行一个整数,每个数的范围为[1,10000]
输出描述
输出树的高度(根节点的高度为1)
示例1
输入
5
5000
2000
5000
8000
1800
输出
3
说明:最终构造出的树如下,高度为3
示例2
输入
3
5000
4000
3000
输出
3
说明:最终构造出的树如下,高度为3
示例3
输入
9
5000
2000
5000
8000
1800
7500
4500
1400
8100
输出
4
说明
最终构造出的树如下,高度为4
解题思路
只需要模拟三叉树结构,然后按照题目要求去插入新节点,并更新高度即可。
参考代码
class TreeNode:def __init__(self, val):self.val = val # 节点值self.height = None # 节点所在高度self.left = None # 左子树self.mid = None # 中子树self.right = None # 右子树class Tree:def __init__(self):self.root = None # 树的根节点self.height = 0 # 树的高度def add(self, val):node = TreeNode(val)if self.root is None:# 如果树是空的,则当前创建的节点将作为根节点node.height = 1 # 根节点的高度为1self.root = nodeself.height = 1else:# 如果树不是空的,则从根节点开始比较cur = self.rootwhile True:# 假设创建的节点node是当前节点cur的子节点,则node节点高度值=cur节点高度值+1node.height = cur.height + 1# 如果创建的node进入新层,则更新树的高度self.height = max(node.height, self.height)if val < cur.val - 500:# 如果数小于节点的数减去500,则将数插入cur节点的左子树if cur.left is None:# 如果cur节点没有左子树,则node作为cur节点的左子树cur.left = node# 停止探索breakelse:# 否则继续探索cur = cur.leftelif val > cur.val + 500:# 如果数大于节点的数加上500,则将数插入节点的右子树if cur.right is None:cur.right = nodebreakelse:cur = cur.rightelse:# 如果数在当前节点值的 -500 和 +500 之间,则将数插入节点的中子树if cur.mid is None:cur.mid = nodebreakelse:cur = cur.midn = int(input())tree = Tree()
for i in range(n):num = int(input())tree.add(num)print(tree.height)