剑指offer(4)重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回
题目分析
本题主要考察了二叉树的遍历,先复习下
前序遍历(VLR):
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树
中序遍历(LVR):
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树
后序遍历(LRV):
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
总之,做这种有关树、链表的题一定要有递归的思想,总之该题的解题思路就是四步,具体思路可以参考这里
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
代码
/* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function reConstructBinaryTree(pre, vin) { // write code here if (pre.length === 0 || vin.length === 0) { return null; } // 前序第一个是根节点,也是中序左右子树的分割点 const index = vin.indexOf(pre[0]), left = vin.slice(0, index), right = vin.slice(index + 1); return { val: pre[0], // 递归左右子树的前序、中序 left: reConstructBinaryTree(pre.slice(1, index + 1), left), right: reConstructBinaryTree(pre.slice(index + 1), right) }; }