剑指 Offer 07. 重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
输入输出
1 2 3 4 5 6 7 8
| 3 / \ 9 20 / \ 15 7
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
|
基本思路
左子树根节点 = 先序根节点坐标 + 1
右子树根节点 = (中序根节点坐标 - 中序左边界)+ 先序根节点坐标 + 1
同时为了提升效率使用一个HashMap存储中序遍历的值和索引的映射 使查找时间复杂度O(1)
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { int[] preorder; HashMap<Integer, Integer> dic = new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder = preorder; for(int i = 0; i < inorder.length; i++){ dic.put(inorder[i], i); } return recur(0, 0, inorder.length -1); } TreeNode recur(int root, int left, int right){ if(left > right) return null; TreeNode node = new TreeNode(preorder[root]); int i = dic.get(preorder[root]); node.left = recur(root + 1, left, i - 1); node.right = recur(i - left + root + 1, i + 1, right); return node; } }
|