哈夫曼树中求空指针域(二叉链表中空指针域)

做题目时遇到了这样的一道题目

设哈夫曼树中共有 99 个结点,则该树中有 ____ 个叶子结点;若采用二叉链表作为存储结构,则该树中有___个空指针域。

哈夫曼树是正则二叉树,没有度为1的结点,N=N2+1+N0,N0=50,显然第一空是50,但是第二空做题时的答案为51,我填的100,一开始比较懵,后面网上找了一些观点看法,发现很多人在纠结二叉链表到底是用双孩子表示法还是孩子兄弟表示法,因为他们认为这两者答案是不一致的。

很显然,很多人被这个孩子兄弟法给搞懵了,我一开始也是这样的,从一开始的答案为100犹豫变为51,然后又确定为100,一开始认为是100是因为我根本没有考虑什么孩子表示法,孩子兄弟表示法,按照常规的叶子结点N0必有2*N0个空指针域。但是后面对答案发现是51,网上找了一些,观点都各有不同,当看到孩子兄弟表示法时,我改变主意了,发现好像是每个孩子都有一个指针指向它的兄弟(根结点除外),于是我的答案变成了51。但是但是但是,后面我画图发现,其实孩子兄弟表示法,并不是每个结点都指向它的一个兄弟的,每个右孩子结点是没有兄弟的!!!而且所有的右叶子结点是没有孩子和兄弟的,更直观的请看下面面这幅图。

所以现在有一个结论为:孩子兄弟表示法和双孩子表示法其实空指针域数都是叶子结点数的两倍,但是不同的是双孩子表示法的空指针域都是叶子结点的,而孩子兄弟表示法的空指针域一部分是叶子结点的,另一部分是其他右孩子结点的空指针域 。

  • 52
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
是一种用于数据压缩的形结构,它可以将一组数据压缩为尽可能短的二进制编码,从而节省存储间。下面是哈的建立过程(二链表实现): 1. 将待压缩的数据按照出现频率从小到大排序,并将每个元素看作一个节点。 2. 从排好序的节点选取两个权值最小的节点,创建一个新节点,其权值为这两个节点的权值之和。将这个新节点插入到原来的节点序列,并将这两个节点从序列删除。 3. 重复步骤 2,直到只剩下一个节点,这个节点就是哈的根节点。 4. 按照先左后右的顺序遍历哈,将每个节点的编码记录下来。左子的编码为 0,右子的编码为 1。 下面是哈建立的具体实现(假设有 n 个节点): ```python # 定义哈的节点类 class Node: def __init__(self, value, freq): self.value = value # 节点代表的值 self.freq = freq # 节点出现的频率 self.left = None # 左子节点 self.right = None # 右子节点 # 建立哈函数 def build_huffman_tree(data): # 创建 n 个节点,并将它们按照频率从小到大排序 nodes = [Node(value, freq) for value, freq in data.items()] nodes.sort(key=lambda x: x.freq) # 不断从序列取出两个权值最小的节点,合并它们,并将新节点插入到序列 while len(nodes) > 1: left_node = nodes.pop(0) right_node = nodes.pop(0) new_node = Node(None, left_node.freq + right_node.freq) new_node.left = left_node new_node.right = right_node nodes.append(new_node) nodes.sort(key=lambda x: x.freq) # 返回哈的根节点 return nodes[0] ``` 上述代码,我们使用字典 data 来存储待压缩的数据,其键为数据的值,值为出现的频率。在函数 build_huffman_tree ,我们首先创建 n 个节点,并将它们按照频率从小到大排序。然后,我们不断从序列取出两个权值最小的节点,合并它们,并将新节点插入到序列,直到只剩下一个节点,这个节点就是哈的根节点。最后,我们返回哈的根节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值