📜  QA – 安置测验| SP 大赛 2 |问题2(1)

📅  最后修改于: 2023-12-03 14:46:49.017000             🧑  作者: Mango

QA – 安置测验| SP 大赛 2 |问题2

简介

本题是SP大赛第二场的第二个问题,主要考察参赛者对于二叉树算法的掌握程度。题目要求在给定的二叉树中,找到符合条件的节点并输出其编号。

题目描述

给定一棵二叉树,要求找到一个节点,它的值大于等于左儿子的值并且小于等于右儿子的值。其中,节点的编号是顺序遍历时的顺序。

输入格式
  • 第一行一个整数n,表示节点总数。
  • 接下来n行,每行两个整数l,r,表示这个节点的左右儿子编号。如果该节点没有左或右儿子,则输入为0。
  • 最后一行,一个整数x,表示题目要求的节点值。
输出格式
  • 输出一个整数,表示题目要求的节点编号。
  • 如果找不到符合条件的节点,则输出-1。
示例

输入:

7
2 3
4 5
0 0
0 6
1 0
0 0
0 0
5

输出:

5
附加说明
  • 节点编号从1开始,顺序遍历时的顺序也从1开始,依次为1,2,3,...,n。
代码示例
# 根据题意建立二叉树
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def build_tree(array):
    nodes = {}
    
    for i, val in enumerate(array):
        if val == 0:
            continue
        nodes[i+1] = TreeNode(val)
        
    for i, val in enumerate(array):
        if val == 0:
            continue
        node = nodes[i+1]
        left_index = val[0]
        right_index = val[1]
        if left_index != 0:
            node.left = nodes[left_index]
        if right_index != 0:
            node.right = nodes[right_index]
            
    return nodes[1]

# 找到符合条件的节点
def find_node(node, x):
    if node is None:
        return -1
    
    if node.val >= x:
        if node.left is not None and node.left.val <= x:
            if node.right is None or node.right.val > x:
                return node.val
        
    left = find_node(node.left, x)
    if left != -1:
        return left
    
    return find_node(node.right, x)

# 主函数
def main():
    n = int(input())
    
    array = []
    for _ in range(n):
        array.append(list(map(int, input().split())))
        
    x = int(input())
    
    root = build_tree(array)
    
    print(find_node(root, x))

main()

代码片段采用markdown格式,并用代码块的形式展示。