问个binary tree问题

t
turen
楼主 (未名空间)

给定一个结构完美的二叉树,类似这样的

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

题目的意思没看太明白,如果知道一层的最左边和最右边,想遍历那一层的话感觉把二叉树里加一个next 指针就可以。

d
dabaojian

既然是完美二叉树 编号放到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

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

完美二叉数的话,bfs出来后的数组,直接根据公式 i的左孩子是2i加1 ,右节点是2i加2 直接选出来了,这样更简单了。

x
xiaoduoduo

这个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:])