了解了二叉堆之后,二叉搜索树就好说了,就是一个节点,左边的子节点是不可能比他大的,右边的子节点是一定大于它的,想了半天终于把创建给写好了。
直接看代码
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 查看评论