Swift-二叉查找树判断

2017-05-16  本文已影响93人  FlyElephant

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

解法一

中序遍历之后,如果数组是有序,那么二叉树是二叉查找树.
<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>

上一篇下一篇

猜你喜欢

热点阅读