题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
Java代码:
核心代码:
private Map<Integer, Integer> inMap;
public TreeNode myBuildTree(int[] preorder, int[] inorder, int pstart, int pend, int istart, int iend){
if(pstart > pend){
return null;
}
int p_root = pstart;
int i_root = inMap.get(preorder[p_root]);
TreeNode root = new TreeNode(preorder[p_root]);
int num = i_root - istart;
root.left = myBuildTree(preorder, inorder, pstart + 1, pstart + num, istart, i_root -1);
root.right = myBuildTree(preorder, inorder, pstart + num + 1, pend, i_root + 1, iend);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length;
inMap = new HashMap<>();
for(int i = 0; i < n; i++){
inMap.put(inorder[i], i);
}
return myBuildTree(preorder, inorder, 0, n-1, 0, n-1);
}
全部代码:
package com.renxia;
import sun.reflect.generics.tree.Tree;
import java.util.HashMap;
import java.util.Map;
public class oneZeroFive {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
private static Map<Integer, Integer> inMap;
public static TreeNode myBuildTree(int[] preorder, int[] inorder, int pstart, int pend, int istart, int iend){
if(pstart > pend){
return null;
}
int p_root = pstart;
int i_root = inMap.get(preorder[p_root]);
TreeNode root = new TreeNode(preorder[p_root]);
int num = i_root - istart;
root.left = myBuildTree(preorder, inorder, pstart + 1, pstart + num, istart, i_root -1);
root.right = myBuildTree(preorder, inorder, pstart + num + 1, pend, i_root + 1, iend);
return root;
}
public static TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length;
inMap = new HashMap<>();
for(int i = 0; i < n; i++){
inMap.put(inorder[i], i);
}
return myBuildTree(preorder, inorder, 0, n-1, 0, n-1);
}
public static void postOrder(TreeNode root){
if(root == null){
return;
}
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val + " ");
}
public static void main(String[] args) {
int[] preorder = new int[]{3, 9, 20, 15, 7};
int[] inorder = new int[]{9, 3, 15, 20, 7};
TreeNode root = buildTree(preorder, inorder);
postOrder(root);
}
}
运行结果:
【此处用后序遍历验证构造二叉树的正确性】