美文网首页
Swift-二叉查找树判断

Swift-二叉查找树判断

作者: FlyElephant | 来源:发表于2017-05-16 18:45 被阅读93次

    题目:检查一棵二叉树是否为二叉查找树.

    解法一

    中序遍历之后,如果数组是有序,那么二叉树是二叉查找树.
    <pre><code>` func copyBST(root:TreeNode?,data:inout [String]) {
    if root == nil {
    return
    }

        copyBST(root: root?.leftChild, data: &data)
        data.append(root!.data!)
        copyBST(root: root?.rightChild, data: &data)
    }
    
    
    func isBST(root:TreeNode?) -> Bool {
        if root == nil {
            return false
        }
        
        var data:[String] = []
        
        copyBST(root: root, data: &data)
        
        print("中序遍历结果---\(data)")
        for i in 0..<data.count - 1 {
            
            if Int(data[i])! > Int(data[i + 1])!  {
                return false
            }
            
        }
        
        return true
    }`</code></pre>
    

    解法二

    中序遍历的数组其实可以不用,只需要记录最后一次访问的数字即可,如果当前数字小于最小数字则不成功.
    <pre><code>` var lastNum:Int = Int.min

    func isBST2(root:TreeNode?) -> Bool {
        if  root == nil {
            return true
        }
        
        // 检查左子树
        if !isBST2(root: root?.leftChild) {
            return false
        }
        
        if Int(root!.data!)! <= lastNum {
            return false
        }
        
        // 检查右子树
        if !isBST2(root: root?.rightChild) {
            return false
        }
        
        return true
    }`</code></pre>
    

    解法三

    二叉查找树的节点左边所有的节点值都小于本身的数值,右边的数值都大于本身的数值,如果数字在最大值和最小值中间则是成功.
    <pre><code>` func isBST3(root:TreeNode?) -> Bool {
    return checkBST3(node: root, min: Int.min, max: Int.max)
    }

    func checkBST3(node:TreeNode?,min:Int,max:Int) -> Bool {
        if  node == nil {
            return true
        }
        
        let value:Int = Int(node!.data!)!
        
        if value < min || value >= max {
            return false
        }
        
        if !checkBST3(node: node?.leftChild, min: min, max: value) || !checkBST3(node: node?.rightChild, min: value, max: max){
            return false
        }
        
        return true
    }`</code></pre>
    

    测试代码:
    <pre><code>`var isBST:Bool = binarySearchTree.isBST(root: searchNode)

    if isBST {
    print("FlyElephant---是二叉查找树")
    } else {
    print("FlyElephant---不是二叉查找树")
    }

    var isBST2:Bool = binarySearchTree.isBST2(root: searchNode)

    if isBST2 {
    print("FlyElephant---是二叉查找树")
    } else {
    print("FlyElephant---不是二叉查找树")
    }

    var isBST3:Bool = binarySearchTree.isBST3(root: searchNode)

    if isBST3 {
    print("FlyElephant---是二叉查找树")
    } else {
    print("FlyElephant---不是二叉查找树")
    }`</code></pre>

    相关文章

      网友评论

          本文标题:Swift-二叉查找树判断

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