在文章开头一定要说一句:闲的没事的人才会想用swift实现二叉树,碰巧我闲的没事,就实现了。本文作者在写此文章时,并未搜索到用swift实现二叉树的例子,所以所有的内容都是我一点点摸索出来的。swift语言对指针相当弱化,但是也确实继承了c语言指针,声明相当麻烦,还要时刻考虑是否为nil,所以能不用时尽量不要用,不信你就看看下面代码里面有多少“!”和“?”吧。
先从指针开始介绍
三大类指针,mutable值可变指针,声明都用选中的这个就可以,我们注意到前面都有Unsafe修饰,可见swift并不提倡用指针这类东西。
开始正题,第一步我们建立一个Tree structure
struct Tree {
var data : Int?//打问号是因为它们都有可能为nil
var lchild : UnsafeMutablePointer<Tree>?
var rchild : UnsafeMutablePointer<Tree>?
}
然后是create a tree 的方法
func createTree(i:Int, n:Int)->UnsafeMutablePointer<Tree>?{//又有问号
var p : UnsafeMutablePointer<Tree>?//又有问号
if (i >= n) {return nil}
p = UnsafeMutablePointer<Tree>.alloc(sizeof(Tree))
p?.memory.data = Int(rand()) % 6 + 1//又有问号,建立满二叉树,data为1到6的随机Int
p?.memory.lchild = createTree(i*2+1, n)//又有问号
p?.memory.rchild = createTree(i*2+2, n)//又有问号
return p
}
然后就是三种遍历方法
func visited(t:UnsafeMutablePointer<Tree>){//输出节点信息
println(String(t.memory.data!))
}
func preOrder(t:UnsafeMutablePointer<Tree>?)//好多问号感叹号
{
if(t != nil)
{
visited(t!)
preOrder(t?.memory.lchild)
preOrder(t?.memory.rchild)
}
}
func inOrder(t:UnsafeMutablePointer<Tree>?)
{
if(t != nil)
{
inOrder(t?.memory.lchild)
visited(t!)
inOrder(t?.memory.rchild)
}
}
func postOrder(t:UnsafeMutablePointer<Tree>?)
{
if(t != nil)
{
postOrder(t?.memory.lchild)
postOrder(t?.memory.rchild)
visited(t!)
}
}
最后就是验证上面代码有没有错误啦
var tree : UnsafeMutablePointer<Tree>? = createTree(0, 7)//创建一个7个节点的二叉树
preOrder(tree!)
println()
inOrder(tree!)
println()
postOrder(tree!)
输出结果:
根据遍历结果建立二叉树,经验证都可以成立,我们的二叉树建成了。