这道是剑指Offer和PTA原题,早年的代码是这样的:
#数据结构与算法学习笔记#剑指Offer4:先序遍历+中序遍历重建二叉树(Java、C/C++)
#数据结构与算法学习笔记#PTA11:先序遍历+中序遍历转后序遍历/二叉树非递归遍历/二叉树栈遍历(JAVA)
如今重新写一遍,追求的已经不再是简单的通过和最佳思路,而是苛求代码的简洁性和效率。相比于之前的简单递归,在其基础上又增加了哈希表用于存储先序遍历元素在中序遍历数组中的位置,大大提高了区间划分速度。后序遍历+中序遍历->构造二叉树原理相同。
Given preorder and inorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
根据一棵树的前序遍历与中序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
Given inorder and postorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
根据一棵树的中序遍历与后序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
import java.util.HashMap;
/**
*
* Given preorder and inorder traversal of a tree, construct the binary tree.
* You may assume that duplicates do not exist in the tree.
* 根据一棵树的前序遍历与中序遍历构造二叉树。
* 你可以假设树中没有重复的元素。
*
*/
public class ConstructBinaryTreeFromPreorderAndInorderTraversal {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
//利用哈希表存储每一个结点的位置,再进行递归建树
int[] preOrder;
int[] inOrder;
int[] postOrder;
HashMap<Integer, Integer> map = new HashMap<>();
//先序遍历 + 中序遍历 -> 重构二叉树
public TreeNode buildTree(int[] preorder, int[] inorder) {
preOrder = preorder;
inOrder = inOrder;
int idx = 0;
for(int value : inorder){
map.put(value, idx++);
}
return Solution(0, 0, inorder.length - 1);
}
public TreeNode Solution(int rootLocPre, int begin, int end){
if(rootLocPre >= preOrder.length || begin > end){
return null;
}
TreeNode root = new TreeNode(preOrder[rootLocPre]);
if(begin != end){
int rootLocIn = map.get(preOrder[rootLocPre]);
root.left = Solution(rootLocPre + 1, begin, rootLocIn - 1);
root.right = Solution(rootLocPre + rootLocIn - begin + 1, rootLocIn + 1, end);
}
return root;
}
//后序遍历 + 中序遍历 -> 重构二叉树
public TreeNode buildTree2(int[] inorder, int[] postorder) {
postOrder = postorder;
inOrder = inOrder;
int idx = 0;
for(int value : inorder){
map.put(value, idx++);
}
return Solution2(postorder.length - 1, 0, inorder.length - 1);
}
public TreeNode Solution2(int rootLocPost, int begin, int end){
if(rootLocPost < 0 || begin > end){
return null;
}
TreeNode root = new TreeNode(postOrder[rootLocPost]);
if(begin != end){
int rootLocIn = map.get(postOrder[rootLocPost]);
root.left = Solution2(rootLocPost - (end - rootLocIn + 1), begin, rootLocIn - 1);
root.right = Solution2(rootLocPost - 1, rootLocIn + 1, end);
}
return root;
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#