創建二叉樹模型
//用的是遞歸枚舉的方式
indirect enum BinaryTree {
case node(_ l:BinaryTree, _ v:String, _ r:BinaryTree)
case empty
}
初始化數據
let nodeI = BinaryTree.node(.empty, "I", .empty)
let nodeG = BinaryTree.node(.empty, "G", .empty)
let nodeH = BinaryTree.node(nodeI, "H", .empty)
let nodeJ = BinaryTree.node(.empty, "J", .empty)
let nodeD = BinaryTree.node(nodeG, "D", nodeH)
let nodeE = BinaryTree.node(.empty, "E", nodeJ)
let nodeF = BinaryTree.node(.empty, "F", .empty)
let nodeB = BinaryTree.node(nodeD, "B", .empty)
let nodeC = BinaryTree.node(nodeE, "C", nodeF)
let nodeA = BinaryTree.node(nodeB, "A", nodeC)
數據類型應該是
前遍歷
func frontTraverseTree(tree:BinaryTree)
{
switch tree {
case .node(let l, let v, let r):
print(v)
traverseTree(tree: l)
traverseTree(tree: r)
default:
break
}
}
中遍歷
func centreTraverseTree(tree:BinaryTree)
{
switch tree {
case .node(let l, let v, let r):
traverseTree(tree: l)
print(v)
traverseTree(tree: r)
default:
break
}
}
後遍歷
func laterTraverseTree(tree:BinaryTree)
{
switch tree {
case .node(let l, let v, let r):
traverseTree(tree: l)
traverseTree(tree: r)
print(v)
default:
break
}
}
層遍歷
func levelTree(tree:BinaryTree)
{
var values = [[String]]()
var nodes = [tree]
while !nodes.isEmpty {
let r = getNodes(nodes)
values.append(r.v)
nodes = r.nodes
}
let result = values.flatMap { $0}
print(result)
}
func getNodes(_ nodes: [BinaryTree]) -> (v: [String], nodes: [BinaryTree])
{
var values = [String]()
var nextNodes = [BinaryTree]()
for n in nodes {
switch n {
case .node(let l, let v, let r) :
values.append(v)
nextNodes.append(l)
nextNodes.append(r)
default:
break
}
}
return (values, nextNodes)
}
打印結果
前遍歷:ABDGHICEJF
中遍歷:GDIHBAEJCF
後遍歷:GIHDBJEFCA
層遍歷:["A", "B", "C", "D", "E", "F", "G", "H", "J", "I"]