Swift-binary search tree

class BinarySearchTree<T:Comparable> {
    private(set) var value:T
    private(set) var parent:BinarySearchTree?
    private(set) var leftChild:BinarySearchTree?
    private(set) var rightChild:BinarySearchTree?
    
    public init(value: T) {
        self.value = value
    }
    
    public convenience init(array: [T]) {
        // 将数组的第一个值赋给root,数组其他的值直接插入到binarySearchTree中
        
        // precondition use as assert
        precondition(array.count > 0)
        self.init(value: array.first!)
        
        // array.dropFirst()
        // A subsequence starting after the first element of the sequence.
        for value in array.dropFirst() {
            insert(value: value)
        }
    }
    
    public var isRoot: Bool {
        return parent == nil
    }
    
    public var isLeftChild: Bool {
        return parent?.leftChild === self
    }
    
    public var isRightChild: Bool {
        return parent?.rightChild === self
    }
    
    public var isChild: Bool {
        return isLeftChild || isRightChild
    }
    
    public var hasLeftChild: Bool {
        return leftChild != nil
    }
    
    public var hasRightChild: Bool {
        return rightChild != nil
    }
    
    public var isLeaf: Bool {
        return (leftChild == nil) && (rightChild == nil)
    }
    
    public var hasAnyChild: Bool {
        return hasLeftChild || hasRightChild
    }
    
    public var count: Int {
        return (leftChild?.count ?? 0) + 1 + (rightChild?.count ?? 0)
    }
    
    public func insert(value: T) {
        if value == self.value {
            return
        }
        
        if value < self.value {
            if let left = self.leftChild {
                left.insert(value: value)
            } else {
                self.leftChild = BinarySearchTree(value: value)
                self.leftChild?.parent = self
            }
        } else {
            if let right = self.rightChild {
                right.insert(value: value)
            } else {
                self.rightChild = BinarySearchTree(value: value)
                self.rightChild?.parent = self
            }
        }
    }
    
    public func search(value: T) -> BinarySearchTree? {
        if value < self.value {
            return self.leftChild?.search(value: value)
        } else if value > self.value {
            return self.rightChild?.search(value: value)
        } else {
            return self
        }
    }
    
    public func traverseInOrder(process: (T) -> Void) {
        leftChild?.traverseInOrder(process: process)
        process(value)
        rightChild?.traverseInOrder(process: process)
    }
    
    public func traversePreOrder(process: (T) -> Void) {
        process(value)
        leftChild?.traversePreOrder(process: process)
        rightChild?.traversePreOrder(process: process)
    }
    
    public func traversePostOrder(process: (T) -> Void) {
        leftChild?.traversePostOrder(process: process)
        rightChild?.traversePostOrder(process: process)
        process(value)
    }
    
    public func minValue() -> BinarySearchTree {
        var node = self
        
        while let next = node.leftChild {
            node = next
        }
        
        return node
    }
    
    public func maxValue() -> BinarySearchTree {
        var node = self
        
        while let next = node.rightChild {
            node = next
        }
        
        return node
    }
    
    // height高度是当前节点到叶子结点的最大距离
    public func height() -> Int {
        if isLeaf {
            return 0
        } else {
            return 1 + max(self.leftChild?.height() ?? 0, self.rightChild?.height() ?? 0 )
        }
    }
    
    // depth 深度是当前到根结点的距离
    public func depth() -> Int {
        var node  = self
        var edges = 0
        while let parent = node.parent {
            node = parent
            edges += 1
        }
        
        return edges
    }
    
    // precede the current value in sorted order
    public func predecessor() -> BinarySearchTree<T>? {
        if let left = self.leftChild {
            return left.maxValue()
        } else {
            var node = self
            while let parent = node.parent {
                if node.isRightChild {
                    return parent
                } else {
                    node = parent
                }
            }
        }
        return nil
    }
    
    public func successor() -> BinarySearchTree<T>? {
        if let right = self.rightChild {
            return right.minValue()
        } else {
            var node = self
            while let parent = node.parent {
                if node.isLeftChild {
                    return parent
                } else {
                    node = parent
                }
            }
        }
        
        return nil
    }

   //判断插入一个值后当前是否还是BST


    public func isBST(min:T, max:T) -> Bool {


        if value < min || value > max {


            return false


        }


        let leftBST = self.leftChild?.isBST(min: min, max: value) ?? true


        let rightBST = self.rightChild?.isBST(min: value, max: max) ?? true


        


        return leftBST && rightBST


    }

private func reconnectParentToNode(node: BinarySearchTree?) {
        if let parent = self.parent {
            if isLeftChild {
                parent.leftChild = node
            } else {
                parent.rightChild = node
            }
        }
        
        node?.parent = self.parent
    }
}

extension BinarySearchTree:CustomStringConvertible {
    var description: String {
        var text = "\(value): {"
        
        if leftChild != nil {
            text += "{ left: " + (leftChild?.description)! + "}"
        }
        if rightChild != nil {
            text += "{ right: " + (rightChild?.description)! + "}"
        }
        
        text += "}"
        
        return text
    }
}

测试:

let bst = BinarySearchTree<Int>(value: 5)
bst.insert(value: 3)
bst.insert(value: 8)
bst.insert(value: 1)
bst.insert(value: 9)
bst.insert(value: 4)
print(bst)

let bstTwo = BinarySearchTree<Int>(array: [5, 3, 8, 1, 9, 4])
print(bstTwo)

bstTwo.search(value: 1)
bstTwo.search(value: 6)

print("PreOrder")
bstTwo.traversePreOrder{value in print(value)}
print("InOrder")
bstTwo.traverseInOrder{value in print(value)}
print("PostOrder")
bstTwo.traversePostOrder{value in print(value)}

bstTwo.minValue()
bstTwo.maxValue()

bstTwo.height()

bstTwo.search(value: 9)?.depth()
bstTwo.search(value: 8)?.predecessor()
bstTwo.search(value: 4)?.successor()

bstTwo.search(value: 4)?.insert(value: 10)

bstTwo.isBST(min: Int.min, max: Int.max)  // false

 

posted @ 2018-03-08 17:06  ShellHan  阅读(125)  评论(0编辑  收藏  举报