swift - 斯威夫特:这是如何创建二叉树的?
问题描述
所以我正在关注一个在线教程,我理解除了这部分之外的所有内容。该人向我解释说,这会创建一个二叉树,可以说其中一个项目链接到两个项目。在这种情况下,一个页面链接到两个页面。我不明白在这个结构Adventure
创建二叉树的例子中这是如何工作的。任何帮助将不胜感激。目前,我为完全不理解这一点而感到非常难过。
import Foundation
class Page {
let story: Story
typealias Choice = (title: String, page:Page)
var firstChoice: Choice?
var secondChoice: Choice?
init(story: Story) {
self.story = story
}
}
extension Page {
// adds the page
func addChoiceWith(title: String, story:Story) -> Page {
let page = Page(story:story)
return addChoiceWith(title: title, page: page)
}
// creates branches
func addChoiceWith(title: String, page: Page) -> Page {
switch (firstChoice, secondChoice) {
case (.some, .some) : return self
case (.none, .none), (.none, .some): firstChoice = (title, page)
case (.some, .none): secondChoice = (title,page)
}
return page
}
}
struct Adventure {
static var story: Page {
let returnTrip = Page(story: .returnTrip)
let touchdown = returnTrip.addChoiceWith(title: "Stop and Investigate", story: .touchDown)
let homeward = returnTrip.addChoiceWith(title: "Continue home to Earth", story: .homeward)
let rover = touchdown.addChoiceWith(title: "Explore the Rover", story: .rover)
let crate = touchdown.addChoiceWith(title: "Open the Crate", story: .crate)
homeward.addChoiceWith(title: "Head back to Mars", page: touchdown)
let home = homeward.addChoiceWith(title: "Continue Home to Earth", story: .home)
let cave = rover.addChoiceWith(title: "Explore the Coordinates", story: .cave)
rover.addChoiceWith(title: "Return to Earth", page: home)
cave.addChoiceWith(title: "Continue towards faint light", story: .droid)
cave.addChoiceWith(title: "Refill the ship and explore the rover", page: rover)
crate.addChoiceWith(title: "Explore the Rover", page: rover)
crate.addChoiceWith(title: "Use the key", story: .monster)
return returnTrip
}
}
解决方案
每个Page
代表树中的一个节点,每个Choice
代表分支。AStory
就像节点的内容。firstChoice.page
并secondChoice.page
表示一个节点的两个子节点。
该Adventure.story
属性创建一棵树并返回根节点。您可以使用 root 访问所有其他节点:
Adventure.story.firstChoice.page.secondChoice.page
现在,让我们看看树是如何构建的。请注意,这不是您一直看到的标准二叉树。一些节点的父节点是子节点。但是每个节点确实有两个孩子。
我会把代码变成伪代码。您可以按照此代码,并在一张纸上自己绘制树。
Create a node called "returnTrip"
Add a child to returnTrip called "touchDown"
Add a child to returnTrip called "homeward"
Add a child to touchDown called "rover"
Add a child to touchDown called "crate"
Connect homeward back to touchDown
Add a child to homeward called "home"
Add a child to rover called "cave"
Connect rover to home
Add a child to cave called "droid"
Connect cave to rover
Connect crate to rover
Add a child to crate called "monster"
推荐阅读
- android - 一个 RenderFlex 在底部溢出了 14 个像素。相关的导致错误的小部件是 AlertDialog
- django - QuerySet' 对象没有属性 'posts'
- .net - 在.net SortedDictionary *无* LINQ 中将“A-1”排在“A-10”之前
- java - 是否有 JPA / JPQL 查询来搜索春季作为 JSON 传递的实体子集?
- statistics - 哪些特征值与负度量相关
- python - 如何根据python数据框中的if行条件找到最接近的col名称?
- php - Wordpress 中的空 GET 参数(使用 Nginx)
- c++ - 如何访问私有 typedef 作为公共函数中的参数
- python - 需要使用 < 和 > 运算符比较 Pandas 中的 DataFrames 以获取列中的特定数据
- arrays - 如何到达指针数组指向的数组?