swift 二叉树

二叉树

  • 创建二叉查找树
  • 前序 中序 后序 遍历(递归/非递归)
  • 深度
  • 判断是否为二叉平衡树
  • 判断是否为二叉平衡树
  • 判断是否为满二叉树
  • 二叉树反转
class BTNode{
    var isFirst:Bool
    var treeNode:TreeNode
    init(_ isFirst:Bool,_ treeNode:TreeNode) {
        self.isFirst = isFirst
        self.treeNode = treeNode
    }
}

class TreeNode{
    var val :Int
    var letf:TreeNode?
    var right:TreeNode?
    init(_ val:Int) {
        self.val = val
    }
    
}

class CreateBTree{
    var tree:TreeNode?
    func insertVal(_ newItem:Int){
        if tree == nil {
            tree = TreeNode(newItem)
        }else{
            var a = tree
            var b = tree
            while a != nil {
                if a!.val<newItem {
                    b = a
                    a = a?.right
                }else{
                    b = a
                    a = a?.letf
                }
            }
            let temp = TreeNode(newItem)
            if b!.val > newItem {
                b?.letf = temp
            }else{
                b?.right = temp
            }
        }
    }
    
     class func resursionInsert (_ val :Int , _ tree :TreeNode?) ->TreeNode? {
        var myTree = tree
        if myTree == nil {
            myTree = TreeNode(val)
        }else{
            if myTree!.val < val {
                myTree?.right =  resursionInsert(val,myTree?.right)
            }else{
                myTree?.letf =  resursionInsert(val,myTree?.letf)

            }
        }
        return myTree
    }
    
    class func resurionPreOrder (_ tree:TreeNode? ,_ vals:inout [Int]) {
        let root = tree
        if root != nil {
            vals.append(root!.val)
            resurionPreOrder(root?.letf,&vals)
            resurionPreOrder(root?.right,&vals)
        }
    }
    class func resurionMidOrder (_ tree:TreeNode? ,_ vals:inout [Int]) {
        let root = tree
        if root != nil {
            resurionMidOrder(root?.letf,&vals)
            vals.append(root!.val)
            resurionMidOrder(root?.right,&vals)
        }
    }
    class func resurionPostOrder (_ tree:TreeNode? ,_ vals:inout [Int]) {
        let root = tree
        if root != nil {
            resurionPostOrder(root?.letf,&vals)
            resurionPostOrder(root?.right,&vals)
            vals.append(root!.val)

        }
    }
    
 class func printOutTree(_ tree:TreeNode?){
        let myTree = tree
        if tree != nil {
            print(myTree!.val)
            printOutTree(myTree?.letf)
            printOutTree(myTree?.right)
        }
    }
    
  class  func preOrder(_ tree:TreeNode?) -> [Int]{
        var vals = [Int]()
        var roots = [TreeNode]()
        var node = tree
        while !roots.isEmpty || node != nil {
            if node != nil {
                vals.append(node!.val)
                roots.append(node!)
                node = node!.letf
            }else{
                node = roots.removeLast().right
            }
        }
        return vals
    }
    
    class func midOrder(_ tree :TreeNode?) ->[Int]{
        var vals = [Int]()
        var roots = [TreeNode]()
        var node = tree
        while !roots.isEmpty || node != nil {
            if node != nil {
                roots.append(node!)
                node = node?.letf
                
            }else{
                node = roots.removeLast()
                vals.append(node!.val)
                node = node?.right
            }
        }
        return vals
    }
    
    
    class  func postOrder(_ tree :TreeNode?) ->[Int]{
        var vals = [Int]()
        var btNodes = [BTNode]()
        var node = tree
        var temp :BTNode?
        while !btNodes.isEmpty || node != nil {
            while node != nil {
                let btTree = BTNode(true,node!)
                btNodes.append(btTree)
                node = node?.letf
            }
            if !btNodes.isEmpty {
                 temp = btNodes.removeLast()
                if temp!.isFirst == true{
                    temp?.isFirst = false
                    btNodes.append(temp!)
                    node = temp?.treeNode.right
                }else{
                    vals.append(temp!.treeNode.val)
                    node = nil
                }
            }

        }
        return vals
    }
    
    class func depthMax(_ root :TreeNode?) -> Int{

        guard let note = root else{
            return 0
        }
        return max(depthMax(note.letf), depthMax(note.right)) + 1
    }
    
    class func numberOfLeafsInTree(_ root:TreeNode?) -> Int{
        let node = root
        if node == nil {
            return 0
        }
        if (node?.letf == nil && node?.right == nil){
            return 1
        }
        
        return numberOfLeafsInTree(node?.letf) + numberOfLeafsInTree(node?.right)
    }
    
    
    private func _helper (_ root :TreeNode? ,_ min:Int?, _ max:Int?) -> Bool{
        guard let node = root else {
            return true
        }
        if let min = min ,node.val <= min{
            return false
        }
        
        if let max = max ,node.val >= max{
            return false
        }
        return _helper(node.letf,min,node.val) && _helper(node.right,node.val,max)
    }
    
      func isValiBST (_ tree:TreeNode)->Bool{
        return _helper(tree,nil,nil)
    }
    
    class func isCompleteBtree(_ tree:TreeNode?) ->Bool{
    var root = tree
    var isComplete = false
    var queue = [TreeNode?]()
        if root == nil {
            return false
        }
        if root?.letf == nil && root?.right == nil{
            return true
        }
        if root?.letf == nil && root?.right != nil{
            return false
        }
        queue.append(root!)
        while !queue.isEmpty {
             root = queue.removeFirst()
            
            if root?.letf == nil && root?.right != nil{
                return false
            }
            
            if isComplete == true && (root?.letf != nil || root?.right != nil ){
                return false
            }
            
            if root?.right == nil{
                isComplete = true
            }
            
            if root?.letf != nil{
                queue.append(root?.letf)
            }
            if root?.right != nil{
                queue.append(root?.right)
            }
        }
        
        
        
        return isComplete
    }
    
    class func isFullBtree (_ tree : TreeNode?) -> Bool{
        let root = tree
        if (root == nil)
        {
            return false
        }
        let depth = CreateBTree.depthMax(root)
        let numLeaf = CreateBTree.numberOfLeafsInTree(root)
        if Decimal(numLeaf) == pow(2, depth-1) {
            return true
        }
        return false
    }
    
    class func invertBinaryTree (_ tree: TreeNode?) -> TreeNode?{
        if tree == nil
        {
            return nil
            
        }
        if tree?.letf == nil && tree?.right == nil
        {
            return tree
            
        }
        invertBinaryTree(tree?.letf )
        invertBinaryTree(tree?.right)
        (tree!.letf,tree!.right) = (tree!.right,tree!.letf)
        return tree

    }
    

    
  private class  func isBalanceTreeOnce(rootNode:TreeNode?,depth:inout Int) -> Bool {
        if rootNode == nil {
            depth = 0
            return true
        }
        var leftDepth:Int = 0
        var rightDepth:Int = 0

        if isBalanceTreeOnce(rootNode: rootNode?.letf, depth: &leftDepth) && isBalanceTreeOnce(rootNode: rootNode?.right, depth: &rightDepth) {
            print("left:\(leftDepth)" )
            print("right:\(rightDepth)")
            print(rootNode!.val)
            let diff:Int = leftDepth - rightDepth
            if diff <= 1 && diff >= -1 {
                depth = leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1
                print(depth)

                return true
            }
        }
        return false
    }
    
   class func isAVLTree(rootNode:TreeNode?) -> Bool {
        var depth:Int = 0
        return isBalanceTreeOnce(rootNode: rootNode, depth: &depth)
    }
    
    
}



var tree = CreateBTree()
[1,2,4,5,7,8,3,6 ].map {
    tree.insertVal($0)
}
var node1 = TreeNode(1)
var node2 = TreeNode(2)
var node3 = TreeNode(3)
var node4 = TreeNode(4)
var node5 = TreeNode(5)
var node6 = TreeNode(6)
var node7 = TreeNode(7)
var node8 = TreeNode(8)
node1.letf = node2
node1.right = node3
node2.letf = node4
node2.right = node5
node5.letf = node7
node5.right = node8
node3.right = node6
var newTree = CreateBTree.resursionInsert(2, nil)
[1,5,6,7,8,9].map {
    CreateBTree.resursionInsert($0, newTree)
}

print(CreateBTree.preOrder(node1))
print(CreateBTree.midOrder(node1))
print(CreateBTree.postOrder(node1))
var valsPre = [Int]()
CreateBTree.resurionPreOrder(node1, &valsPre)
print (valsPre)
var valsMid = [Int]()
CreateBTree.resurionMidOrder(node1, &valsMid)
print (valsMid)
var valsPost = [Int]()
CreateBTree.resurionPostOrder(node1, &valsPost)
print (valsPost)

print (CreateBTree.depthMax(node1))

print(tree.isValiBST(newTree!))
node1.letf = node2
node1.right = node3
node2.letf = node4
node2.right = nil
node3.letf = nil
node3.right = nil
print(CreateBTree.isCompleteBtree(node1))
print (CreateBTree.depthMax(node1))
print(CreateBTree.isFullBtree(node1))
print(CreateBTree.preOrder(node1))
var newTreenode = CreateBTree.invertBinaryTree(node1)
print(CreateBTree.preOrder(node1))
print(CreateBTree.isCompleteBtree(node1))
print(CreateBTree.isAVLTree(rootNode: node1))
//aaaf
//CreateBTree.printOutTree(tree.tree)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 本文首发于我的个人博客:尾尾部落 0. 几个概念 完全二叉树:若二叉树的高度是h,除第h层之外,其他(1h-1)层...
    繁著阅读 3,176评论 3 49
  • 上一节讲了链表的基本实现,今天让我们来简单的了解下二叉树.在二叉树中涉及到好多的基本概念,这些请自行百度,我们的主...
    小码儿阅读 494评论 0 0
  • 我的CSDN: ListerCi我的简书: 东方未曦 一、二叉树与递归 二叉树与递归有着千丝万缕的联系,二叉树在定...
    东方未曦阅读 6,372评论 3 9
  • 二叉树常见的四种遍历方式,先序遍历,中序遍历,后序遍历以及层次遍历,先来看一张二叉树的图: 遍历之前我们可以先自己...
    FlyElephant阅读 2,389评论 0 2
  • 之前的文章中关于二叉树的先序遍历,中序遍历,后序遍历,层次遍历,当然我们可以根据二叉树的先序和中序, 重构二叉树,...
    FlyElephant阅读 296评论 0 1