当前位置: 首页 > news >正文

跟我一起学“仓颉”算法-二叉查找树练习题

目录

一、练习题

二、小结


一、练习题

1. 给定一个字母二叉树的树叶删除序列,输出树的先序遍历。

package Algorithm.bst import std.collection.* public class Node { public var val: String public var left: Option<Node> public var right: Option<Node> public init(val: String) { this.val = val this.left = Option<Node>.None this.right = Option<Node>.None } } public class LeafDeletionSequenceToPreorder { // 根据树叶删除序列构建二叉树 public static func buildTreeFromLeafDeletion(deletionSequence: Array<String>): Node { // 反转删除序列,得到类似后序遍历的顺序 let reversed = Array<String>(deletionSequence.size, repeat: '') for (i in 0..deletionSequence.size) { reversed[i] = deletionSequence[deletionSequence.size - 1 - i] } // 使用哈希表记录每个节点的父节点关系 let nodeMap = HashMap<String, Node>() var root = Option<Node>.None // 处理反转后的序列 for (i in 0..reversed.size) { let current = reversed[i] let currentNode = Node(current) nodeMap.add(current, currentNode) if (i > 0) { let parentChar = reversed[i - 1] var parentNode = nodeMap[parentChar] if (parentNode.left.isNone()) { parentNode.left = currentNode } else { parentNode.right = currentNode } } else { root = currentNode } } return root.getOrThrow() } // 先序遍历二叉树 public static func preorderTraversal(root: Option<Node>): String { let sb = StringBuilder() preorderHelper(root, sb) return sb.toString() } private static func preorderHelper(node: Option<Node>, sb: StringBuilder): Unit { if (node.isNone()) { return } sb.append(node.getOrThrow().val) preorderHelper(node.getOrThrow().left, sb) preorderHelper(node.getOrThrow().right, sb) } }

测试代码

package Algorithm import Algorithm.bst.* main(): Int64 { // 示例输入 let deletionSequence = ["C", "B", "D", "A"] // 构建二叉树 let root = LeafDeletionSequenceToPreorder.buildTreeFromLeafDeletion(deletionSequence) // 输出先序遍历结果 let preorder = LeafDeletionSequenceToPreorder.preorderTraversal(root) println("前序遍历: " + preorder) return 0 }

二、小结

本章为大家详细的介绍了仓颉数据结构与算法中二叉查找树练习题的内容,下一章,为大家带来平衡二叉树的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉数据结构与算法有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

http://www.gsyq.cn/news/1297536.html

相关文章:

  • 基于Adafruit Gemma M0与NeoPixel的可编程交互发光头饰制作全攻略
  • 参数失控?画风平庸?Midjourney抽象表现主义进阶必修课,含5套已验证Prompt模板+权重调试日志
  • AI写教材必备:低查重工具实测,30分钟生成10万字专业教材!
  • 5分钟掌握英雄联盟国服换肤:R3nzSkin完整解决方案
  • Opengrep性能优化终极指南:如何实现秒级代码扫描
  • 机器人基础模型 π0.7:一个模型做咖啡、叠衣服、洗盘子——通用机器人从「实验室」走进「厨房」
  • Microsoft-OpenAI 分手进行时:独家云合作终结,Sam Altman 抛「超级智能新政」——AI 行业进入多极时代
  • Apple Music JS核心组件深度解析:从播放器到界面交互
  • Bootstrap Application Wizard最佳实践总结:避免常见陷阱的15个要点
  • Spectre:支持编译时契约评估,可转换 C 代码的安全底层编程语言!
  • Promises/A+完全指南:深入理解JavaScript异步编程标准规范
  • 终极指南:如何让苹果触控板在Windows上获得专业级体验
  • ISG系统三大电机结构深度解析:永磁同步、感应与开关磁阻电机对比
  • 手机的智能体AI,正在因为天玑全面跃升
  • TestableMock与Kotlin完美结合:解决协程和扩展函数Mock难题终极指南
  • 海底生物检测-目标检测数据集(包括VOC格式、YOLO格式)
  • 今起,老年旅客12306购票有打折优惠服务!
  • 超越点灯:用JTAG调试XCZU3EG MPSOC时,你可能会忽略的3个硬件细节与1个Vivado设置
  • 基于RK3568核心板的智能家居控制器:从芯片选型到量产实战
  • RT-Thread Smart在QEMU RISC-V虚拟机上的开发环境搭建与调试实践
  • Raiden Network API开发教程:构建去中心化应用的完整指南
  • React Native Picker Select 自定义扩展教程:创建专属选择器组件的3种方法
  • TIDoS-Framework核心架构解析:理解5个阶段的设计原理
  • 为什么选择Lacinia?5大优势带你了解这个强大的GraphQL解决方案
  • 响应式的几种解决方案——媒体查询、flex、grid、多列布局、瀑布流和数据可视化屏幕的缩放处理
  • demo-magic实用技巧:模拟网络连接和隐藏后台操作的完整方案
  • 深入nRF5340 Audio的音频数据流:从USB采集到I2S播放的代码逐行分析
  • Django 表单(Forms)与数据验证:处理用户提交与防止常见攻击
  • Claude反复催用户睡觉,AI“性格病”不止这一种!
  • 从Inkscape到PDF:深入理解LaTeX(TeX Live 2023)处理SVG图像的完整工作流与原理