[ABC255F] Pre-order and In-order Solution

更好的阅读体验戳此进入

题面

给定一棵二叉树的先序遍历和中序遍历,请构造一棵以 1 节点为根的二叉树。第 i 行输出节点 i 的左右儿子,儿子为空则输出 0。无解输出 -1

Solution

也是一道水题,考虑先序和中序的意义即可。

众所周知,先序遍历的顺序是根、左子树、右子树。中序遍历是左子树、根、右子树。

于是不难发现,在当前的先序遍历中取第一个数即为当前的根,然后在中序遍历中找到根的位置,其左侧即为整个左子树,右侧为整个右子树。于是不难想到 dfs 即可,参数维护当前的整个子树属于先序遍历的 [lp,rp],属于中序遍历的 [li,ri],然后需要记录每个数的位置,通过中序遍历根和左右之间的数的个数,可计算左右子树的大小,以此即可确定先序遍历左右子树的下一个区间,以此递归下去即可。

考虑无解的情况,要么先序遍历的第一个值不为 1,说明二叉树根不为 1。要么就是在递归过程中,确定先序的第一位为根之后,根在中序中的位置超出了当前的限制位置,在这两种特殊情况记录一下无解即可。

Code

UPD

update-2022_12_07 初稿