从零开始学swift(四)-算法之二叉树的建立与遍历

在文章开头一定要说一句:闲的没事的人才会想用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!)

输出结果:

根据遍历结果建立二叉树,经验证都可以成立,我们的二叉树建成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值