数据结构-满k叉树例题

今天写数据结构题,有一个比较深刻的,记录在这里,方便日后查看翻阅。

题目:
一个深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问:
(1)各层的结点数目是多少?
(2)编号为i的结点的双亲结点(若存在)的编号是多少?
(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?
(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?
答:

(1)各层的结点数目是多少?

第一层: 1 1 1
第二层: k k k
第三层: k ∗ k k*k kk
第四层: k ∗ k ∗ k k*k*k kkk
第n层: k n − 1 k^{ n-1} kn1

(2)编号为i的结点的双亲结点(若存在)的编号是多少?

我先画了一个满三叉树图,方便思考(并不是这道题就是三叉树,题目给的是满k叉树,我只是为了方便才选择三叉树的)
数据结构-满k叉树例题_1
假设i的位置如上,j是i的第一个子节点。
i 的前面有(i-1)个节点,每一个节点有k 个子节点,
所以j 前面有((i-1)*k)+1 个节点,为什么要加1呢,
因为(i-1)*k 没有包括根节点,
所以j 前面的节点再加一,((i-1)*k)+2 就是j 节点的编号。

( ( i − 1 ) ∗ k ) + 2 ((i-1)*k)+2 i1k+2

衍生问题,如果问的是i的第k个孩子的编号怎么办?
第一个孩子 ( i − 1 ) ∗ k ) + 2 (i-1)*k)+2 i1k+2
那么第k个孩子 ( i − 1 ) ∗ k ) + 2 + k − 1 (i-1)*k)+2 + k -1 i1k+2+k1

(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?

再画一个图,把i和j的位置换一下
数据结构-满k叉树例题_2

这次就是求i 的父节点j 的编号,我只会使用数学的推算方法,联想不出来这个题。
因为i是j子节点,所以可以用j 来求i 的编号,
i = ( ( j − 1 ) ∗ k ) + 2 i=((j-1)*k)+2 i=((j1)k)+2
i − 2 = ( j − 1 ) ∗ k i-2=(j-1)*k i2=(j1)k
( i − 2 ) / k = j − 1 (i-2)/k=j-1 (i2)/k=j1
j = ( ( i − 2 ) / k ) + 1 j=((i-2)/k)+1 j=((i2)/k)+1

第三题就是通过第二题得到的结果,逆向推理得到的结果,这是目前我会的唯一方法。

(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?

数据结构-满k叉树例题_3
图中红色的就是没有右兄弟,除了红色的节点,其他的节点都有右兄弟
通过图片可以发现,只要i 不是每个节点的最右节点,
换个说法,只要i 不是双亲的第k个孩子就有右兄弟
对于任意的节点p ,其k 个子节点的编号是p*k+1
则有:
i ! = p ∗ k + 1 i!= p*k+1 i!=pk+1
i − 1 ! = p ∗ k i-1 != p*k i1!=pk
最后结果可以写成:
( i − 1 ) % k ! = 0 (i-1)\% k !=0 (i1)%k!=0
其实就是保证当前节点减一不是k的倍数,就可以保证该节点是有右兄弟的。

这道题我也是在网上看解析看了好久看懂的,但是网上的没有系统的讲解这个问题的,索性我自己总结下来,方便日后自己复习,或者帮助其他人学习这个问题。
希望对你有帮助。

  • 108
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
哈夫曼树是一种特殊的二叉树结构,用于编码和解码数据。在哈夫曼树中,每个叶子节点都代表一个字符或符号,并且具有一个与之关联的权值,代表该字符或符号出现的频率或概率。根据哈夫曼树的概念,我们可以通过给定的叶子节点的权值来构建哈夫曼树。 对于给定的叶子节点的权值,构建哈夫曼树的步骤如下: 1. 首先,根据叶子节点的权值从小到大进行排序。 2. 选取权值最小的两个叶子节点,并将它们作为两个子节点创建一个新的父节点。新父节点的权值等于这两个子节点的权值之和。 3. 将这个新的父节点插入到叶子节点中,同时删除原来的两个子节点。 4. 重复步骤2和步骤3,直到只剩下一个节点,即根节点,这个节点就是哈夫曼树的根节点。 根据题目提供的例子,我们可以看到一种不是建树的方法,只使用数组来模拟哈夫曼树的构造过程。这种方法是通过数组来存储节点的信息,并通过一些特定的计算方式来模拟构建哈夫曼树的过程。 根据题目的描述,我们需要根据叶子节点的个数和权值来生成哈夫曼树,并计算所有节点的值与权值的乘积之和。这个问题可以通过构建哈夫曼树的步骤来解决。首先,我们需要将叶子节点根据权值进行排序。然后,按照步骤2和步骤3构建哈夫曼树,直到只剩下一个节点。最后,计算所有节点的值与权值的乘积之和。 综上所述,数据结构哈夫曼树的例题是通过给定叶子节点的权值来构建哈夫曼树,并计算所有节点的值与权值的乘积之和。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [超好理解的哈夫曼树(最优二叉树)与例题](https://blog.csdn.net/weixin_45720782/article/details/109316157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值