题目:检查一棵二叉树是否为二叉查找树.
解法一
中序遍历之后,如果数组是有序,那么二叉树是二叉查找树.
<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>
网友评论