Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

(Swift 实现)二叉搜索树 —— 创建

$
0
0

了解了二叉堆之后,二叉搜索树就好说了,就是一个节点,左边的子节点是不可能比他大的,右边的子节点是一定大于它的,想了半天终于把创建给写好了。

直接看代码

import UIKit

var str = "二叉搜索树"
//这个就不跟前面的完全二叉树一样了,得自己建了类或者结构体了,我建了个类
class erchaTreeNote {
    var  data: Int
    var leftChild: erchaTreeNote!
    var rightChild: erchaTreeNote!
    init(data:Int) {
        self.data = data
    }
}

var a = [12,321,432,213,423,4]

func createTree() -> (erchaTreeNote) {

    let root = erchaTreeNote(data:a[0]);
    for x in a[1...a.count-1] {

        let child = erchaTreeNote(data: x)

        var temp = root
        //循环的条件想了半天,想着如何能走下去,在纸上练了几遍,发现了规律,本来进来一个数如果它加进去了,它的左右子节点都是空的,再往下就不走了,但是这个是走不通的,再想他们有什么共性,我就想,既然把它按在了树上,那它再走一次,必然和上一次的路径是一样的,当我找到和它一模一样的时候,就是结束的时候,如果我找不到它,一直都不能结束。就按这个条件走就出来了。

        while temp !== child {
        //如果进来的数小于父节点
            if child.data < temp.data {
            //不为空,那我就把父节点左边子节点拿上,再重新来过
                if temp.leftChild != nil
                {
                    temp = temp.leftChild
                }
             //当父节点左边是空的时候,那就直接填上
                else
                {
                    temp.leftChild = child     
                    print("\(temp.data)左边的孩子")
                    temp = child //优化语句
                }
            }else //进来的数大于父节点
            {
            //不为空,那我就把父节点右边子节点拿上,重新来过
                if temp.rightChild != nil {
                    temp = temp.rightChild
                }
            //当父节点的右边为空的时候,那就直接补上    
                else
                {
                    temp.rightChild = child
                    print("\(temp.data)右边的孩子")
                    temp = child //优化语句
                }   
            }
        }
        print(child.data)
    }
    return root
}
createTree()

就酱,还是蛮有成就感的。要是不对,咱们一起讨论

作者:u010095372 发表于2017/3/24 18:03:40 原文链接
阅读:18 评论:1 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>