VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2674|回复: 14

请教:如何查找完全二叉树最后一层的最右边的结点

[复制链接]

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-6 12:00:01 | 显示全部楼层 |阅读模式
如题。
对基于数组实现完全二叉树容易做到,只需返回数组最后一项。
但是对基于指针实现的完全二叉树,应该使用什么算法呢?
多谢!
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-6 17:30:01 | 显示全部楼层


右子树的右子树的右子树

直到最后一层

这样不是行了吗??
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-6 17:48:01 | 显示全部楼层
不对啊,完全二叉树不一定是满二叉树啊。
在最后一层,所有结点从左至右依次无缝排列。
回复

使用道具 举报

3

主题

9

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-7 10:09:01 | 显示全部楼层
确实,用GoFastRight();函数寻找有点麻烦!
回复

使用道具 举报

0

主题

17

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-1-7 10:39:01 | 显示全部楼层
广度优先搜索。
回复

使用道具 举报

0

主题

4

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-7 12:18:01 | 显示全部楼层
:) 用一个链表,做按层的搜索。
第一层,把根扔进链表。
第二层,找到根的L、R子节点,替换链表中的根。
第三层,找到根的L、R子节点的子节点,替换到链表中。
如此递归,如果某个节点没有子节点,就删掉了,否则就被自己的子节点替换。保持子节点从左到右的顺序。
这样到最后一层,最后一个子节点就是你要找的了。

当然实现的时候要把一层遍历完,才能删除上一层的。 :)
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-7 16:09:01 | 显示全部楼层
哦,我明白了。
就是说采用基于队列的广度优先遍历,每次从队列弹出已访问的结点入栈,遍历结束后在栈顶的数据项即为所求。
这种算法的复杂度的确比基于数组的复杂度大的多啊。
回复

使用道具 举报

0

主题

10

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-8 08:45:01 | 显示全部楼层
按层遍历的最后一个结点
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-15 16:27:02 | 显示全部楼层
从头开始不断找右子树,没有右子树就找左子树。一直到叶子节点。
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-15 17:27:01 | 显示全部楼层
上面ch1074856 的方法是错的,请无视。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表