二叉树--最小路径

探讨了二叉树中从根节点到叶子节点的最小路径问题,关注如何找到距离最短的路径。

最小路径

二叉树中的最小路径指的是,二叉树中根节点到达叶子节点的路径中,距离最短的一个。

//recursively
public int minDepth1(TreeNode root) {
    if (root == null) {
        return 0;
    } else if (root.left != null && root.right != null) {
        return 1+Math.min(minDepth(root.left), minDepth(root.right));
    } else {
        return 1+Math.max(minDepth(root.left), minDepth(root.right));
    }
}

// iteratively, BFS
public int minDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    int depth = 1;
    while (!queue.isEmpty()) {
        int l = queue.size();
        for (int i = 0; i < l; i++) {
            TreeNode n = queue.poll();
            if (n.left == null && n.right == null) {
                return depth;
            } 
            if (n.left != null) {
                queue.add(n.left);
            }
            if (n.right != null) {
                queue.add(n.right);
            }
        }
        depth++;
    }
    return depth;
}
### 赫夫曼树在二叉树中的解码过程分析 赫夫曼树是一种特殊的二叉树,其设计目标是最小化加权路径长度(WPL),从而使得高频使用的字符具有较短的编码[^1]。这种特性使其成为数据压缩的理想工具之一。 #### 1. **赫夫曼树的构建** 赫夫曼树的构建基于贪心算法的思想。首先将所有待编码的字符按照权重从小到大排列,每次选取两个权重最小的节点合并为一个新的节点,并将其权重设为这两个节点权重之和。重复此操作直到只剩下一个节点为止,这个最终的节点即为赫夫曼树的根节点[^2]。 #### 2. **赫夫曼编码机制** 在赫夫曼树中,每个叶节点代表一个字符,而从根节点到某个叶节点的路径上的每一步都对应于一位二进制编码:“0”表示向左子树移动,“1”表示向右子树移动。因此,任意字符的编码就是从根节点到达该字符所在叶节点所经过的所有边的方向序列[^3]。 #### 3. **赫夫曼解码原理** 解码的过程可以看作是对已建立好的赫夫曼树的一次遍历。以下是具体的解码步骤: - 初始状态位于赫夫曼树的根节点。 - 对于输入的每一位编码位: - 若当前位为`'0'`,则沿着当前节点的左分支向下移动; - 若当前位为`'1'`,则沿右分支向下移动; - 如果遇到非法字符(既不是 `'0'`也不是 `'1'`),说明编码串存在错误,应立即停止并报告错误[^4]。 - 当移动至某叶节点时,表明已经找到一个完整的字符编码。此时记录下该叶节点对应的字符,并重置当前位置回到树的根节点继续处理剩余的编码流[^5]。 #### 4. **代码示例** 下面是一个简单的C++实现片段展示如何完成上述解码逻辑: ```cpp int HuffMan::Decode(const string codestr, char txtstr[]) { int c = len; // 初始化c指向根节点 int k = 0; // 记录txtstr的位置索引 for (size_t i = 0; i < codestr.length(); ++i) { char ch = codestr[i]; if (ch == '0') { c = huftree[c].left; } else if (ch == '1') { c = huftree[c].right; } else { return error; // 遇到非法字符直接返回错误 } if (!huftree[c].left && !huftree[c].right) { // 叶节点检测 txtstr[k++] = huftree[c].data; // 存储解码得到的字符 c = len; // 返回根节点重新开始 } } if (c != len || k == 0) return error; // 检查最后是否停留在非根节点或无有效解码 txtstr[k] = '\0'; // 添加字符串终止符 return ok; // 成功标志 } ``` 以上代码实现了基本的赫夫曼解码功能,其中`len`是赫夫曼树内部存储的最大编号,通常等于两倍原始字符数量减去一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值