任务
给定完整二叉树的前遍历和后遍历,返回其有序遍历。
遍历将表示为两个列表,两个列表均包含n个不同的正整数,每个列表唯一地标识一个节点。您的程序可能会采用这些列表,并使用任何合理的I / O格式输出结果顺序遍历。
您可以假设输入是有效的(也就是说,列表实际上表示对某些树的遍历)。
这是code-golf,因此以字节为单位的最短代码获胜。
定义
一个满二叉树是有限的结构节点,这里由唯一的正整数表示。
完整的二叉树是由单个节点组成的叶子:
1
或一个分支,由一个带有两个子树的节点组成(称为左子树和右子树),每个子树又是一个完整的二叉树:
1 / \ … …
这是完整的二叉树的完整示例:
6
/ \
3 4
/ \ / \
1 8 5 7
/ \
2 9
该前序遍历的满二叉树的递归定义如下:
- 包含节点n的叶子的预遍历是列表[ n ]。
- 包含节点n和子树(L,R)的分支的预排序遍历是列表[ n ] + 预排序(L)+ 预排序(R),其中+是列表串联运算符。
对于上面的树,就是[6,3,1,8,2,9,9,4,5,7]。
完整二叉树的后遍历定义如下:
- 包含节点n的叶子的后序遍历是列表[ n ]。
- 包含节点n和子树(L,R)的分支的后序遍历是列表后序(L)+ 后序(R)+ [ n ]。
对于上面的树,这是[1、2、9、8、3、5、7、4、6]。
在中序遍历满二叉树的递归定义如下:
- 包含节点n的叶子的有序遍历是列表[ n ]。
- 包含节点n和子树(L,R)的分支的有序遍历是列表有序(L)+ [ n ] + 有序(R)。
对于上面的树,这是[1、3、2、8、9、6、5、4、7]。
结论:给定一对列表[6、3、1、8、2、9、4、5、7](前置)和[1、2、9、8、3、5、7、4、6](post)作为输入,您的程序应输出[1、3、2、8、9、6、5、4、7]。
测试用例
每个测试用例均采用格式preorder, postorder → expected output
。
[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]
由于保证输入具有特定的形状(完整的二叉树),因此您实际上并不需要两个输入,是吗?
—
feersum
二叉树是full,但不是complete,因此n元素树可以具有许多形状,通常,您确实需要两者。
—
林恩
我可以将节点表示为单个字母,为订单提供字符串。如第二个例子将成为:
—
Ton Hospel
"CDE" and "DEC" give "DCE"
?(如果我需要很多节点,甚至可以使用unicode字母)
@TonHospel我对此表示满意–可以说,您所做的只是稍微扩展了整数列表的定义,因为
—
Lynn
"CDE"
与[67, 68, 69]
:: 并没有很大不同:)