Swift-二叉查找樹判斷

題目:檢查一棵二叉樹是否為二叉查找樹.

解法一

中序遍歷之后,如果數組是有序,那么二叉樹是二叉查找樹.
<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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 樹的概述 樹是一種非常常用的數據結構,樹與前面介紹的線性表,棧,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,489評論 1 31
  • 四、樹與二叉樹 1. 二叉樹的順序存儲結構 二叉樹的順序存儲就是用數組存儲二叉樹。二叉樹的每個結點在順序存儲中都有...
    MinoyJet閱讀 1,585評論 0 7
  • 數據結構和算法--二叉樹的實現 幾種二叉樹 1、二叉樹 和普通的樹相比,二叉樹有如下特點: 每個結點最多只有兩棵子...
    sunhaiyu閱讀 6,529評論 0 14
  • 原文出處:http://www.cnblogs.com/maybe2030/p/4715035.html引文出處:...
    明教de教主閱讀 9,220評論 0 7
  • 1/ 我做為第二次參加2017年6月15日AACTP會議小感受: 總結:準時開場,流程順暢,亮點突出,稍顯沉悶。 ...
    NANA0閱讀 189評論 0 0