二叉树的最大深度和最小深度及应用在判断平衡二叉树上

104. Maximum Depth of Binary Tree

题目:给定一棵二叉树,返回最大深度

方法一:递归,运行40ms
class Solution(object):
    def maxDepth(self, root):
    	if not root: return 0
        return 1 + max(self.maxDepth(root.left),self.maxDepth(root.right))
方法二:层次遍历,运行28ms
class Solution(object):
    def maxDepth(self, root):
    	depth = 0
        level = [root] if root else []  # 记录每一层的节点
        while level:   
            depth += 1
            level = [kid for n in level for kid in (n.left,n.right) if kid]
        return depth

111. Minimum Depth of Binary Tree

题目:给定一棵二叉树,返回最小深度

方法一:Wrong answer

像求最大深度一样写,返回的是左右子树的最小深度,但是这样是错误的
考虑特殊情况:当二叉树是一条链时,最小深度就是链长,而不是为1

class Solution(object):
    def maxDepth(self, root):
    	if not root: return 0
        return 1 + min(self.maxDepth(root.left),self.maxDepth(root.right))
方法二:改进以上方法
class Solution(object):
    def minDepth(self, root):
        if not root: return 0
        if not root.left: return self.minDepth(root.right) + 1
        if not root.right: return self.minDepth(root.left) + 1
        return min(self.minDepth(root.left), self.minDepth(root.right)) + 1

110. Balanced Binary Tree

题意:判断一棵树是否为平衡二叉树,平衡二叉树的定义为:对于树中的每一个节点,左右子树的高度都相差不超过1.

方法一:暴力求解每个节点的左右子树的高度,O(N^2)
class Solution(object):
    def isBalanced(self, root):
        
        def dfs(root):    # 求一棵树的最大深度,本篇博客的第一道题。
            if not root: return 0
            return 1 + max(dfs(root.left), dfs(root.right))   # 相当于一个递归栈,每次返回都+1
          
        if not root: return True
        left = dfs(root.left)
        right = dfs(root.right)
        
        return abs(left - right) <=1 and self.isBalanced(root.left) and self.isBalanced(root.right)  # 递归判断子节点
方法二:后序遍历,自底向上判断
def isBalanced(self, root):

	def dfs(root):  # 定义为以root为根的树,返回左右子树的最大高度
	    if not root: return 0
	    left = dfs(root.left) # 左子数的高度
	    right = dfs(root.right) # 右子树的高度
	    if abs(left - right) > 1:
	        self.isBalanced = False
	    return 1 + max(left, right)  # 自底向上来遍历节点
        
    self.isBalanced = True
    dfs(root)
    return self.isBalanced
<think>首先,用户的问题是比较平衡二叉树二叉排序树的结构差异,并询问它们是否相同。我需要基于系统级指令来构建回答。 关键系统级指令: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX 语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 - 参考提供的引用内容。 提供的引用: - [^1]: 平衡二叉树的目的是减少二叉查找树层次,提高查找速度。平衡二叉树或为空树,或为:左右子树深度之差的绝对值不超过1;左右子树仍为平衡二叉树平衡因子BF。 - [^2]: 平衡二叉树(AVL树)是特殊的二叉排序树。任意节点的左右子树高度差不超过1。插入删除可能导致不平衡,需调整最小平衡树。 - [^3]: 二叉排序树查找效率在平衡时为 $O(\log_2 n)$。中序遍历得到有序序列。插入操作。 - [^4]: 最小平衡子树的概念,调整不平衡子树的四种情况。 用户问题:比较平衡二叉树二叉排序树的结构差异,并问它们是否相同。 核心点:二叉排序树(BST)平衡二叉树(如 AVL 树)是不同的。二叉排序树是一种二叉树,其中左子树所有节点小于根,右子树所有节点大于根。平衡二叉树是二叉排序树的一种特殊形式,添加了平衡条件。 结构差异: - 二叉排序树:没有强制平衡要求,可能导致退化为链表,查找效率 $O(n)$。 - 平衡二叉树:强制平衡要求,如 AVL 树中,每个节点的左右子树高度差不超过1,确保查找效率 $O(\log n)$。 所以,结构上,平衡二叉树是二叉排序树的子集,但添加了额外的约束。 回答结构: 1. **引入问题**:清晰陈述问题。 2. **解释二叉排序树**:定义特性。 3. **解释平衡二叉树**:定义特性,强调它是二叉排序树的扩展。 4. **比较差异**:列出关键结构差异。 5. **结论**:它们是否相同?不,平衡二叉树是二叉排序树的优化版本。 6. **添加引用**:在相关部分末尾添加引用标识。 7. **生成相关问题**:在后添加相关问题。 使用中文回答。 行内数学表达式:例如,查找效率 $O(\log n)$。 独立公式:如果需要,但这里可能不需要复杂的公式。 生成相关问题:基于主题,如优化、应用等。 参考引用: - 引用 [^1] [^2] 定义了平衡二叉树。 - 引用 [^3] 提到二叉排序树的查找效率。 - 引用 [^4] 讨论调整不平衡子树。 在回答中自然地添加引用,例如:平衡二叉树通过平衡因子确保平衡 [^1]。 终结论:结构不同,平衡二叉树有额外的平衡约束。</think>### 平衡二叉树与二叉排序树的结构差异比较 平衡二叉树二叉排序树在结构上并不相同。平衡二叉树是二叉排序树的一种特殊形式,它在二叉排序树的基础上添加了额外的平衡约束,以提高查找效率。下面我将逐步解释两者的定义、特性及关键差异,帮助您清晰理解。 #### 1. **二叉排序树的结构** - **定义**:二叉排序树(Binary Search Tree, BST)是一种二叉树结构,其中每个节点满足以下条件: - 左子树的所有节点值均小于根节点值。 - 右子树的所有节点值均大于根节点值。 - 左子树右子树本身也是二叉排序树。 - **特性**: - 没有强制平衡要求,树的结构取决于插入顺序。如果插入有序数据(如升序序列),树可能退化为链表,导致查找效率降至 $O(n)$。 - 中序遍历二叉排序树会得到一个有序序列,这体现了其排序特性。 - 查找、插入删除操作的平均时间复杂度为 $O(\log n)$,但坏情况下为 $O(n)$。 - 例如,插入操作时,新节点总是作为叶子节点添加,不会自动调整树高 [^3]。 #### 2. **平衡二叉树的结构** - **定义**:平衡二叉树(如 AVL 树)是二叉排序树的一种优化变体。它要求: - 任意节点的左右子树高度差(平衡因子)的绝对值不超过 1(即 $|\text{BF}| \leq 1$)。 - 左右子树也必须满足平衡条件。 - 平衡因子 BF 定义为左子树高度减右子树高度。 - **特性**: - 通过平衡约束,确保树的高度始终接近最小可能值,从而将查找、插入删除操作的时间复杂度稳定在 $O(\log n)$。 - 插入或删除节点可能导致不平衡,此时需通过旋转操作(如左旋、右旋)调整最小平衡子树(即导致不平衡最小子树),以恢复平衡 [^1][^2][^4]。 - 例如,在插入后,如果某个节点的 $|\text{BF}| > 1$,系统会检测并调整该节点及其子树。 #### 3. **关键结构差异** 以下是两者的主要结构差异对比表,便于直观理解: | 特性 | 二叉排序树 (BST) | 平衡二叉树 (如 AVL) | |---------------------|--------------------------------------|------------------------------------------| | **平衡约束** | 无强制平衡要求。 | 必须满足 $|\text{BF}| \leq 1$,否则需调整 [^1][^2]。 | | **树高与效率** | 坏情况下树高为 $O(n)$,查找效率 $O(n)$;理想情况下为 $O(\log n)$ [^3]。 | 树高始终为 $O(\log n)$,查找效率稳定在 $O(\log n)$。 | | **调整机制** | 插入或删除后无需调整结构。 | 插入或删除后,需检查并调整最小平衡子树(通过旋转操作)[^4]。 | | **结构稳定性** | 结构易受插入顺序影响,可能退化为链表。 | 结构高度稳定,不易退化,适合动态数据场景。 | | **应用场景** | 适用于数据变动少或随机插入的场景。 | 适用于频繁插入/删除且要求高效查找的场景,如数据库索引。 | #### 4. **结论:结构是否相同?** - **不相同**。平衡二叉树是二叉排序树的子集或扩展,它在二叉排序树的排序特性基础上,添加了严格的平衡约束(如平衡因子限制)。这导致两者的结构存在本质差异: - 二叉排序树的结构可能“不平衡”,而平衡二叉树通过强制平衡机制,确保树始终接近完全二叉树形态。 - 因此,所有平衡二叉树都是二叉排序树,但并非所有二叉排序树都是平衡二叉树 [^1][^2][^3]。 #### 5. **示例说明** 假设插入序列为 [1, 2, 3, 4, 5]: - **二叉排序树**:可能退化为右斜树(类似链表),高度为 5,查找效率 $O(n)$。 - **平衡二叉树**:通过旋转调整,形成高度平衡的树(例如根节点为 3,左子树 [1,2],右子树 [4,5]),高度为 $O(\log 5) \approx 3$,查找效率 $O(\log n)$。 这种差异源于平衡二叉树对“最小平衡子树”的动态调整机制,确保高效性 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值