Swift-二叉平衡树

题目:二叉平衡树表示树中的任意一个结点,其两棵子树的高度不超过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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,698评论 4 32
  • 0. 什么是树 数据的基本单位是数据元素,在涉及到数据处理时数据元素之间的关系称之为结构,我们依据数据元素之间关系...
    安安zoe阅读 499评论 0 0
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,603评论 0 7
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,396评论 0 25
  • 一. 算法之变,结构为宗 计算机在很多情况下被应用于检索数据,比如航空和铁路运输业的航班信息和列车时刻表的查询,都...
    Leesper阅读 7,035评论 13 42