美文网首页
swift创建查找二叉树

swift创建查找二叉树

作者: 前年的邂逅_Jerry | 来源:发表于2019-10-21 17:38 被阅读0次


class TreeNode{
    var val : Int
    var left : TreeNode?
    var right : TreeNode?
    init(_ val : Int) {
        self.val = val
        right = nil
        left = nil
    }
}
class BTree {
    fileprivate var root : TreeNode?
    /// 是否为查找二叉树
    func isSearchBTree(_ node : TreeNode? , min : Int? , max :Int?) -> Bool {
        guard let node = node else{
            return true
        }
        if let min = min , node.val < min{
            return false
        }
        
        if let max = max , node.val > max{
            return false
        }
        
        return isSearchBTree(node.left , min: min , max: node.val) && isSearchBTree(node.right , min: node.val , max: max)
    }
    /// 树的深度
    func bTreeDepth(_ node : TreeNode?) -> Int{
        guard let node = node else{
            return 0
        }
        return max(bTreeDepth(node.left), bTreeDepth(node.right)) + 1
    }
    
    
    func addNode(_ val : Int) {
        if root == nil{
            root = TreeNode(val)
            return
        }
        var lastNode : TreeNode? = root
        var preNode : TreeNode?  = root
        while lastNode != nil{
            if val <= lastNode!.val {
                //遍历左节点
                preNode = lastNode
                lastNode = lastNode!.left
            }else{
                preNode = lastNode
                lastNode = lastNode!.right
            }
        }
        if val <= preNode!.val{
            preNode?.left = TreeNode(val)
        }else{
            preNode?.right = TreeNode(val)
        }
    }
    /// 先根遍历
    func preOrder() -> [Int]{
        var arr = [Int]()
        preOrderHelper(self.root, &arr)
        return arr
    }
    private func preOrderHelper(_ node : TreeNode?, _ arr : inout [Int]){
        if let node = node{
            arr.append(node.val)
            preOrderHelper(node.left, &arr)
            preOrderHelper(node.right, &arr)
        }
    }
    /// 中根遍历
    func inOrder() -> [Int]{
        var arr = [Int]()
        inOrderHelper(self.root,&arr)
        return arr
    }
    func inOrderHelper(_ node : TreeNode?, _ arr : inout [Int]) {
        if let node = node{
            inOrderHelper(node.left, &arr)
            arr.append(node.val)
            inOrderHelper(node.right, &arr)
        }
    }
    /// 后根遍历
    func postOrder() -> [Int]{
        var arr = [Int]()
        postOrderHelper(self.root,&arr)
        return arr
    }
    func postOrderHelper(_ node : TreeNode?, _ arr : inout [Int]) {
        if let node = node{
            postOrderHelper(node.left, &arr)
            postOrderHelper(node.right, &arr)
            arr.append(node.val)
        }
    }
    /// 栈的前根遍历
    func preOrderByStack() -> [Int]{
        var res = [Int]()
        var stacks = [TreeNode]()
        var node = self.root
        while stacks.count != 0 || node != nil {
            if node != nil{
                res.append(node!.val)
                stacks.append(node!)
                node =  node!.left
            }else{
                node = stacks.removeLast().right
            }
        }
        return res
    }
    /// 栈的中根遍历
    func inOrderByStack() -> [Int]{
        var res = [Int]()
        var stacks = [TreeNode]()
        var node = self.root
        while stacks.count != 0 || node != nil {
            if node != nil{
                stacks.append(node!)
                node =  node!.left
            }else{
                node = stacks.removeLast()
                res.append(node!.val)
                node = node?.right
                
            }
        }
        return res
    }
    /// 栈的后根遍历
    func postOrderByStack() -> [Int]{
        var res = [Int]()
        var stacks = [TreeNode]()
        var tagStacks = [Int]()
        var node = root
        while stacks.count > 0 || node != nil {
            while node != nil {
                tagStacks.append(0)
                //入栈
                stacks.append(node!)
                node = node?.left
            }
            while tagStacks.last == 1 {
                tagStacks.removeLast()
                res.append(stacks.removeLast().val)
            }
            if node == nil && tagStacks.count > 0{
                //出栈
                tagStacks.removeLast()
                tagStacks.append(1)
                node = stacks.last
                node = node?.right
            }
        }
        return res
    }
    /// 层次遍历
    func levelOrder() -> [[Int]] {
        var res = [[Int]]()
        var queue = [TreeNode]()
        if let node = root{
            queue.append(node)
        }
        while queue.count > 0 {
            var level = [Int]()
            for _ in 0..<queue.count{
                let node = queue.removeFirst()
                level.append(node.val)
                if let node = node.left{
                    queue.append(node)
                }
                if let node = node.right{
                    queue.append(node)
                }
            }
            res.append(level)
        }
        return res
    }
}

        let arr = [13,4,13,17,8,11,9,0,12,3]
        let bt = BTree()
        for item in arr {
            bt.addNode(item)
        }
        print("---先根遍历---")
        print(bt.preOrder())
        print("---中根遍历---")
        print(bt.inOrder())
        print("---后根遍历---")
        print(bt.postOrder())
        print("---树的层数---")
        print(bt.bTreeDepth(bt.root))
        print("--栈的先根遍历---")
        print(bt.preOrderByStack())
        print("--栈的中根遍历---")
        print(bt.inOrderByStack())
        print("--栈的后根遍历---")
        print(bt.postOrderByStack())
        print("---是否为查找二叉树---")
        print(bt.isSearchBTree(bt.root, min: nil, max: nil))
        print("---层次遍历二叉树---")
        print(bt.levelOrder())

结果:

---先根遍历---
[13, 4, 0, 3, 13, 8, 11, 9, 12, 17]
---中根遍历---
[0, 3, 4, 8, 9, 11, 12, 13, 13, 17]
---后根遍历---
[3, 0, 9, 12, 11, 8, 13, 4, 17, 13]
---树的层数---
6
--栈的先根遍历---
[13, 4, 0, 3, 13, 8, 11, 9, 12, 17]
--栈的中根遍历---
[0, 3, 4, 8, 9, 11, 12, 13, 13, 17]
--栈的后根遍历---
[3, 0, 9, 12, 11, 8, 13, 4, 17, 13]
---是否为查找二叉树---
true
---层次遍历二叉树---
[[13], [4, 17], [0, 13], [3, 8], [11], [9, 12]]
创建查找二叉树.jpeg

相关文章

网友评论

      本文标题:swift创建查找二叉树

      本文链接:https://www.haomeiwen.com/subject/rtxxvctx.html