美文网首页
Swift-二叉平衡树

Swift-二叉平衡树

作者: FlyElephant | 来源:发表于2017-05-13 11:22 被阅读40次

    题目:二叉平衡树表示树中的任意一个结点,其两棵子树的高度不超过1,判断一棵树是不是二叉平衡树.


    二叉平衡树.jpg

    解法一

    直接递归遍历每个结点的左右节点,比较差值,如果符合条件,继续比较,否则直接返回.
    <pre><code>` func treeNodeHeight(treeNode:TreeNode?) -> Int {
    if treeNode == nil {
    return 0
    }

        return max(treeNodeHeight(treeNode:treeNode?.leftChild), treeNodeHeight(treeNode: treeNode?.rightChild)) + 1
    }
    
    func isBalanced(root:TreeNode?) -> Bool {
        
        if root == nil {
            return true
        }
        
        let heightDiff:Int = abs(treeNodeHeight(treeNode: root?.leftChild) - treeNodeHeight(treeNode: root?.rightChild))
        
        if heightDiff > 1 {
            return false
        } else {
            return isBalanced(root:root?.leftChild) && isBalanced(root:root?.rightChild)
        }
        
    }`</code></pre>
    

    解法二

    递归最大的问题大于多次重复计算,因此将每次计算的结果保存结果,解法一中获取高度同时还可以计算是否是平衡树,对解法一进行改进如下:
    <pre><code>` func checkTreeNodeHeight(treeNode:TreeNode?) -> Int {
    if treeNode == nil {
    return 0
    }

        // 检查左子树是否平衡
        let leftHeight:Int = checkTreeNodeHeight(treeNode: treeNode?.leftChild)
        if leftHeight == -1 {
            return -1
        }
        
        let rightHeight:Int = checkTreeNodeHeight(treeNode: treeNode?.rightChild)
        
        if rightHeight == -1 {
            return -1
        }
        
        let heightDiff:Int = abs(leftHeight - rightHeight)
        if heightDiff > 1 {
            return -1
        } else {
            return max(leftHeight, rightHeight) + 1
        }
        
    }
    
    
    func isBalanced2(root:TreeNode?) -> Bool {
        if checkTreeNodeHeight(treeNode: root) == -1 {
            return false
        } else {
            return true
        }
    }`</code></pre>
    

    测试结果:
    <pre><code>`var binaryTree:BinarTree = BinarTree()
    var isBalanced:Bool = binaryTree.isBalanced(root: preOrderRoot)
    if isBalanced {
    print("FlyElephant---是二叉平衡树")
    } else {
    print("FlyElehant---不是二叉平衡树")
    }

    var isBalanced2:Bool = binaryTree.isBalanced2(root: preOrderRoot)
    if isBalanced2 {
    print("FlyElephant---是二叉平衡树")
    } else {
    print("FlyElehant---不是二叉平衡树")
    }`</code></pre>

    FlyElephant.png

    相关文章

      网友评论

          本文标题:Swift-二叉平衡树

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