看帖神器
未名空间
追帖动态
头条新闻
每日新帖
最新热帖
新闻存档
热帖存档
文学城
虎扑论坛
未名空间
北美华人网
北美微论坛
看帖神器
登录
← 下载
《看帖神器》官方
iOS App
,体验轻松追帖。
问个binary tree问题
查看未名空间今日新帖
最新回复:2020年1月18日 16点46分 PT
共 (6) 楼
返回列表
订阅追帖
只看未读
更多选项
阅读全帖
只看图片
只看视频
查看原帖
t
turen
4 年多
楼主 (未名空间)
给定一个结构完美的二叉树,类似这样的
1
3 2
7 6 5 4
15 14 13 12 11 10 9 8
如何按层先找到两边的元素,满足一定条件后在iterate它们之间的每一个元素
第二层,找到 3 和 2
第二层,找到7 和 4
第三层, 找到15 和 8
然后我想iterate 14,13, 12, 11, 10, 9
有什么可行的算法吗?
谢谢
o
onehacker
4 年多
2 楼
题目的意思没看太明白,如果知道一层的最左边和最右边,想遍历那一层的话感觉把二叉树里加一个next 指针就可以。
d
dabaojian
4 年多
3 楼
既然是完美二叉树 编号放到map里
要什么给什么
【 在 turen (兔--仁) 的大作中提到: 】
: 给定一个结构完美的二叉树,类似这样的
:
: 1
: 3 2
: 7 6 5 4
: 15 14 13 12 11 10 9 8
: 如何按层先找到两边的元素,满足一定条件后在iterate它们之间的每一个元素
: 第二层,找到 3 和 2
: 第二层,找到7 和 4
: 第三层, 找到15 和 8
: ...................
J
Jun0214
4 年多
4 楼
1 初始定义一个计数器count =0 ,先将root的左结点推入队列q,然后将root右极点推入队列。
2 从q中取一个节点,放入数组或print,如果count是偶数,将此节点的左节点推入队
列,如果count是奇数则将此节点的右节点推入队列。count 加1.
3 不断循环第2步,直到队列为空。
这样可以依次打印每层最两头的元素。 根据条件再打印中间的没看懂什么意思。
解法2
直接bfs. 顺序得到所有 n个元素。另外在bfs的同时把每个元素的层级level信息存在
一个长度为n的数组level。
然后对这个n个元素的数组进行二次处理,相邻两个元素的level如果不同,则为上一层的尾元素和下一层首元素,单独组合出来数组1,其他的元素也单独组合出来数组2。
J
Jun0214
4 年多
5 楼
完美二叉数的话,bfs出来后的数组,直接根据公式 i的左孩子是2i加1 ,右节点是2i加2 直接选出来了,这样更简单了。
x
xiaoduoduo
4 年多
6 楼
这个leetcode有同样的题吧
def helper(root,d):
if not root: return
if len(res)==d:
res.append([root.val,None])
else:
res[d][-1]=root.val
helper(root.left,d+1)
helper(root.right,d+1)
res=[]
helper(root,0)
print(res[1:])
请输入帖子链接
收藏帖子
给定一个结构完美的二叉树,类似这样的
1
3 2
7 6 5 4
15 14 13 12 11 10 9 8
如何按层先找到两边的元素,满足一定条件后在iterate它们之间的每一个元素
第二层,找到 3 和 2
第二层,找到7 和 4
第三层, 找到15 和 8
然后我想iterate 14,13, 12, 11, 10, 9
有什么可行的算法吗?
谢谢
题目的意思没看太明白,如果知道一层的最左边和最右边,想遍历那一层的话感觉把二叉树里加一个next 指针就可以。
既然是完美二叉树 编号放到map里
要什么给什么
【 在 turen (兔--仁) 的大作中提到: 】
: 给定一个结构完美的二叉树,类似这样的
:
: 1
: 3 2
: 7 6 5 4
: 15 14 13 12 11 10 9 8
: 如何按层先找到两边的元素,满足一定条件后在iterate它们之间的每一个元素
: 第二层,找到 3 和 2
: 第二层,找到7 和 4
: 第三层, 找到15 和 8
: ...................
1 初始定义一个计数器count =0 ,先将root的左结点推入队列q,然后将root右极点推入队列。
2 从q中取一个节点,放入数组或print,如果count是偶数,将此节点的左节点推入队
列,如果count是奇数则将此节点的右节点推入队列。count 加1.
3 不断循环第2步,直到队列为空。
这样可以依次打印每层最两头的元素。 根据条件再打印中间的没看懂什么意思。
解法2
直接bfs. 顺序得到所有 n个元素。另外在bfs的同时把每个元素的层级level信息存在
一个长度为n的数组level。
然后对这个n个元素的数组进行二次处理,相邻两个元素的level如果不同,则为上一层的尾元素和下一层首元素,单独组合出来数组1,其他的元素也单独组合出来数组2。
完美二叉数的话,bfs出来后的数组,直接根据公式 i的左孩子是2i加1 ,右节点是2i加2 直接选出来了,这样更简单了。
这个leetcode有同样的题吧
def helper(root,d):
if not root: return
if len(res)==d:
res.append([root.val,None])
else:
res[d][-1]=root.val
helper(root.left,d+1)
helper(root.right,d+1)
res=[]
helper(root,0)
print(res[1:])