剑指Offer(四):重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:递归思想,每次将左右两棵子树当成新的子树进行处理。(在ide里模拟所以从后往前看)
- 前序的第一个索引就是根节点,在中序数组中找到根节点的位置idx_root,idx_root的左边是左子树,右边是右子树。
- 进而得到中序遍历的左右子树的两个数组vL_vin, vR_vin。前序数组的左子树起点为idx_root+1,同理得到前序遍历的左右子树的数组。
- 对上述前序和中序得到的左右子树的数组分别进行二叉树重建,递归求解,递归一次,返回一次根节点。
- 直到数组长度为1,说明左右子树只有一个节点,叶节点,二叉树整理完毕,不用递归建树,直接返回该叶节点,递归结束。
1 |
|