剑指 Offer.07-重建二叉树
剑指 Offer.07-重建二叉树
题目链接
<剑指 Offer 07. 重建二叉树>
问题描述
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字
官方解法
利用先序遍历与中序遍历的性质,寻找当前树的根节点,再依次对左右子树进行调用即可
- 前序遍历:[根节点,左子树,右子树]
- 中序遍历:[左子树,根节点,右子树]
根据两种遍历的特性,可得以下推论
- 先序遍历的首元素为树的根节点
- 根据先序遍历的根节点,可简单将中序遍历划分为[左子树,根节点,右子树]
- 根据中序遍历左右节点的数量,可将前序遍历划分为[根节点,左子树,右子树]
具体方案
利用上述特性,确定当前树的根节点,左子树的根节点,右子树的根节点,并通过递归调用,最终复原完整的树
代码
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
| 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(root+i-left+1,i+1,right); return node; } }
|
图解