剑指 Offer 07. 重建二叉树
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
解题思路
递归
- 由preorde知道root元素为preorder[0]
- 在inorder中找到root的位置为index
- 左子树的preorder为[1,index + 1),inorder为[0,index)
- 右子树的preorder为[index + 1,length),inorder为[index + 1,length)
- 递归得到左右子树,连接到root
代码
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder.length == 0) return null; int length = preorder.length; int index = 0; TreeNode root = new TreeNode(preorder[0]); for(int i = 0;i < inorder.length;i++) { if(inorder[i] == preorder[0]) { index = i; break; } } root.left = buildTree(Arrays.copyOfRange(preorder, 1, 1+index), Arrays.copyOfRange(inorder, 0, index)); root.right = buildTree(Arrays.copyOfRange(preorder, index+1, length), Arrays.copyOfRange(inorder, index+1, length)); return root; } }
剑指Offer 文章被收录于专栏
剑指Offer刷题记录和详细题解