Leetcode - Tree - Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth.

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode *root) { // 时间复杂度O(n),空间复杂度O(sqrt(n)),如果是binarysearch Tree则为O(lgn)
        if(root==NULL)
            return 0;
        int depthLeft=maxDepth(root->left);
        int depthRight=maxDepth(root->right);
        return depthLeft>=depthRight?depthLeft+1:depthRight+1;
    }
};


<think>好的,我需要回答用户关于二叉树、表达式树和哈夫曼树的概念及用法的问题。首先,我应该分别解释每个树结构的基本定义和特点,然后讨论它们的应用场景,最后可能举一些例子来帮助理解。 首先,二叉树(Binary Tree)是每个节点最多有两个子节点的树结构。根据引用[1],二叉树常见的应用包括二叉搜索树、红黑树等。需要提到二叉树的几种类型,比如完全二叉树、满二叉树,以及二叉搜索树(BST)的特性,如左子树节点小于根节点,右子树节点大于根节点,这里可以参考引用[2]提到的BST不变性。 接下来是表达式树(Expression Tree),这是一种特殊的二叉树,用于表示算术表达式。内部节点是操作符,叶子节点是操作数。需要解释如何通过中序、前序或后序遍历来得到不同的表达式表示形式,比如中缀、前缀和后缀表达式。例如,表达式树的结构如何对应到具体的表达式,可能需要举一个简单的例子,比如(a + b) * c对应的树结构。 然后是哈夫曼树(Huffman Tree),用于数据压缩。需要提到哈夫曼编码的过程,如何根据字符频率构建最优前缀码,使得编码后的数据长度最短。这里可能需要解释贪心算法在构建哈夫曼树中的应用,参考引用[3]提到的贪心算法相关内容。例如,如何选择频率最低的两个节点合并,直到形成根节点。 在用法部分,二叉树的应用可以包括二叉搜索树的高效查找,表达式树用于编译器的语法分析,哈夫曼树用于文件压缩。需要确保每个部分都结合引用中的内容,比如引用[1]提到的哈夫曼编码属于二叉树的应用之一。 然后生成相关问题,可能需要围绕每种树结构的特性、构建方法、应用场景以及相关算法(如贪心算法在哈夫曼树中的使用)展开。例如,如何构建表达式树,哈夫曼编码的具体步骤,或者二叉搜索树的时间复杂度分析。 需要检查是否符合用户的要求,比如使用正确的中文术语,数学公式用$...$格式,独立公式用$$...$$。例如,在解释哈夫曼树的带权路径长度时,可能需要用公式表示:$$WPL = \sum_{i=1}^{n} w_i \times l_i$$,其中$w_i$是叶子节点的权重,$l_i$是路径长度。 最后,确保回答结构清晰,分点说明每个树结构的概念和用法,并自然地加入引用标记,比如在提到哈夫曼树时引用[1],在二叉搜索树的BST不变性时引用[2]等。</think>### 二叉树(Binary Tree) **定义**:二叉树是每个节点最多有2个子节点的树结构,子节点分为左子节点和右子节点[^1]。 **核心特性**: - 二叉搜索树(BST)满足**BST不变性**:左子树所有节点值 < 根节点值 < 右子树所有节点值[^2] - 常见类型:满二叉树、完全二叉树、平衡二叉树(如AVL树、红黑树) **应用场景**: 1. 二叉搜索树用于高效查找(时间复杂度$O(\log n)$)[^2] 2. 堆(完全二叉树)实现优先队列 3. 语法分析、文件系统目录结构 --- ### 表达式树(Expression Tree) **定义**:用二叉树表示算术/逻辑表达式,叶子节点为操作数,内部节点为操作符。 **构建规则**: - 操作符优先级决定树结构,例如表达式$(a + b) * (c - d)$对应的树结构为: ```text * / \ + - / \ / \ a b c d ``` **遍历方式**: - 中序遍历 → 中缀表达式(需加括号) - 后序遍历 → 后缀表达式(逆波兰表示法) **应用场景**: 1. 编译器解析表达式 2. 自动计算表达式值(通过后序遍历求值) --- ### 哈夫曼树(Huffman Tree) **定义**:带权路径长度(WPL)最小的二叉树,用于数据压缩[^1]。 **构建算法**(贪心策略[^3]): 1. 将所有字符视为单节点树,权重为频率 2. 重复合并权重最小的两棵树,直到只剩一棵树 **关键公式**: 带权路径长度 $$WPL = \sum_{i=1}^{n} w_i \times l_i$$ 其中$w_i$为叶子节点权重,$l_i$为根到该叶子的路径长度 **应用场景**: 1. 哈夫曼编码(前缀编码,无歧义解码) 2. 文件压缩(如ZIP、JPEG) --- ### 对比总结 | 类型 | 核心特性 | 典型应用 | 时间复杂度 | |-----------|-----------------------|----------------|------------| | 二叉树 | 每个节点最多2个子节点 | 搜索、排序、存储结构 | $O(\log n)$ | | 表达式树 | 操作符在内部节点,操作数在叶子节点 | 表达式解析、计算器 | $O(n)$ | | 哈夫曼树 | 最小带权路径长度 | 数据压缩、编码优化 | $O(n \log n)$ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值