求教数据结构小问题。

xplovexjy 2009-02-08 05:39:18
是不是在完全二叉树中,假设左右孩子的下标为a,b,那么他们的父节点下标为a/2,或者b/2

就是说 可是要是左孩子的下标为2,右孩子的下表为3,那么父亲节点的下标应该为1啊,也就是右孩子下标的一般不等于1.


可是为什么有些程序为:
   // 假设p为右孩子,然后要找出她的父节点的位置
while (p > 1 && p % 2) {
t[p/2] = winner(e, t[p-1], t[p]);
p=p/2; // 为什么右节点直接可以一半化就可以找到父节点位置??
}
...全文
161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
o46382509 2009-02-08
  • 打赏
  • 举报
回复
补充下!这要看你的P是什么类型的了!
从代码中看P应该为int型,这时计算机做除操作时会把结果从浮点型转到整型!
也就是说5/2应该=2.5,计算机得到的是浮点数而你又进行赋值操作!
p=5/2则p=2!应为folat转向int自动省去小数位!
Pajack 2009-02-08
  • 打赏
  • 举报
回复
“/”是取整的,如5/2=2。
Pajack 2009-02-08
  • 打赏
  • 举报
回复
基础,回归教材。。
xmu_才盛 2009-02-08
  • 打赏
  • 举报
回复
mark
潇离 2009-02-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ljmscsq 的回复:]
完全二叉树就是这个样子
父节点下标a,左孩子2a,右孩子2a+1
[/Quote]恩
云风 2009-02-08
  • 打赏
  • 举报
回复
a/2 = (a + 1)/2;
ljmscsq 2009-02-08
  • 打赏
  • 举报
回复
完全二叉树就是这个样子
父节点下标a,左孩子2a,右孩子2a+1
dongming1011 2009-02-08
  • 打赏
  • 举报
回复
右孩子下标下般不为1是的。但是有可能就是那树只有一个结点,这个时候怎么个说法就不好了吧,也可以说没有左右子树,也可以说左右子树为空,也可以说是左右子树为父结点本身。可能是出于这种不规范的表达吧。
[Quote=引用楼主 xplovexjy 的帖子:]
是不是在完全二叉树中,假设左右孩子的下标为a,b,那么他们的父节点下标为a/2,或者b/2

就是说 可是要是左孩子的下标为2,右孩子的下表为3,那么父亲节点的下标应该为1啊,也就是右孩子下标的一般不等于1.


可是为什么有些程序为:

C/C++ code // 假设p为右孩子,然后要找出她的父节点的位置
while (p > 1 && p % 2) {
t[p/2] = winner(e, t[p-1], t[p]);
p=p/2; // 为什么右节点直接可以一半…
[/Quote]
waizqfor 2009-02-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 xplovexjy 的帖子:]
是不是在完全二叉树中,假设左右孩子的下标为a,b,那么他们的父节点下标为a/2,或者b/2

就是说 可是要是左孩子的下标为2,右孩子的下表为3,那么父亲节点的下标应该为1啊,也就是右孩子下标的一般不等于1.


可是为什么有些程序为:

C/C++ code // 假设p为右孩子,然后要找出她的父节点的位置
while (p > 1 && p % 2) {
t[p/2] = winner(e, t[p-1], t[p]);
p=p/2; // 为什么右节点直接可以一半…
[/Quote]
就是这样查找的啊 LZ需要看看树的存储形式
du51 2009-02-08
  • 打赏
  • 举报
回复
是的..3/2 == 2/2 == 1


这个思想..在建堆的时候,最明显.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧