博客
关于我
PAT 1127 ZigZagging on a Tree[难]
阅读量:794 次
发布时间:2023-02-26

本文共 1821 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要根据给定的中序和后序遍历序列,构建二叉树,并按照“zigzag”顺序输出节点的值。zigzag顺序是指从根开始,按层遍历,奇数层从左到右,偶数层从右到左。

方法思路

  • 构建二叉树:使用中序和后序遍历序列,通过递归函数确定每个节点的位置,并构建二叉树的结构。
  • 广度优先遍历:记录每个节点的深度和顺序,分层存储节点。
  • 生成zigzag顺序:根据层级的奇偶性,决定输出顺序,奇数层按顺序输出,偶数层反转顺序输出。
  • 解决代码

    import sysfrom collections import dequen = int(sys.stdin.readline())inorder = list(map(int, sys.stdin.readline().split()))postorder = list(map(int, sys.stdin.readline().split()))tree = {}root_id = 0def build(inL, inR, postL, postR):    global root_id    if inL > inR:        return    val = postorder[postR]    idx = inL    while idx <= inR and inorder[idx] != val:        idx += 1    l_size = idx - inL    current_id = root_id    tree[current_id] = {'left': None, 'right': None, 'value': val}    left_id = current_id + 1    build(inL, idx-1, postL, postL + l_size - 1, left_id)    right_id = current_id + 2    build(idx + 1, inR, postL + l_size, postR - 1, right_id)    root_id += 1build(1, n, 1, n)queue = deque()queue.append((0, 0))layer_nodes = []while queue:    node_id, depth = queue.popleft()    if len(layer_nodes) <= depth:        layer_nodes.append([])    layer_nodes[depth].append(node_id)    left = tree.get(node_id, {}).get('left', None)    if left is not None:        queue.append((left, depth + 1))    right = tree.get(node_id, {}).get('right', None)    if right is not None:        queue.append((right, depth + 1))result = []for depth in range(len(layer_nodes)):    nodes = layer_nodes[depth]    if depth % 2 == 0:        result.extend([tree[node]['value'] for node in nodes])    else:        result.extend([tree[node]['value'] for node in reversed(nodes)])print(' '.join(map(str, result)))

    代码解释

  • 读取输入:从标准输入读取节点数、中序和后序遍历序列。
  • 构建二叉树:使用递归函数build,根据中序和后序遍历确定每个节点的位置,并构建二叉树结构。
  • 广度优先遍历:使用队列进行层次遍历,记录每层的节点顺序。
  • 生成结果:根据层级的奇偶性,生成zigzag顺序,奇数层按顺序,偶数层反转顺序,输出结果。
  • 这个方法确保了我们能够正确构建二叉树,并按照指定的zigzag顺序输出节点值。

    转载地址:http://pxvfk.baihongyu.com/

    你可能感兴趣的文章
    Oracle笔记(十三) 视图、同义词、索引
    查看>>
    Oracle笔记(十) 约束
    查看>>
    Oracle系列:安装Oracle RAC数据库(二)
    查看>>
    oracle系统 介绍,ORACLE数据库管理系统介绍
    查看>>
    oracle获取数据库表、字段、注释、约束等
    查看>>
    oracle表空间查询维护命令大全之三(暂时表空间)史上最全
    查看>>
    oracle表访问方式
    查看>>
    Oracle触发器
    查看>>
    Oracle计划将ZGC项目提交给OpenJDK
    查看>>
    oracle账号共享
    查看>>
    Oracle闪回技术(Flashback)
    查看>>
    oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
    查看>>
    oracle零碎要点---oracle em的web访问地址忘了
    查看>>
    Oracle零碎要点---多表联合查询,收集数据库基本资料
    查看>>
    Oracle静默安装
    查看>>
    【Bert101】变压器模型背后的复杂数学【02/4】
    查看>>
    Oracle面试题:Oracle中truncate和delete的区别
    查看>>
    ThreadLocal线程内部存储类
    查看>>
    thinkphp 常用SQL执行语句总结
    查看>>
    Oracle:ORA-00911: 无效字符
    查看>>