Leetcode106(从中序与后序遍历序列构造二叉树)
package tree;
import java.util.HashMap;
import java.util.Map;
public class LeetCode106 {
public static void main(String[] args) {
}
public static TreeNode buildTree(int[] inorder,int[] postorder) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i<inorder.length;i++) {
map.put(inorder[i], i); //将中序的值和索引
}
return travelWay(inorder,0,inorder.length,postorder,0,postorder.length,map);
}
//9-3-15-20-7 中
//9-5-7-20-3 后
public static TreeNode travelWay(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd,Map<Integer,Integer> map) {
if(inBegin>=inEnd||postBegin>=postEnd) {
return null;
} //不满足左闭右开,说明没有元素
int rootIndex = map.get(postorder[postEnd-1]); //找到结点的索引值
TreeNode root = new TreeNode(inorder[rootIndex]); //获取结点的数值
int lenOfleft = rootIndex-inBegin;
root.left = travelWay(inorder,inBegin,rootIndex,postorder,postBegin,lenOfleft,map); //左中 左后
root.right = travelWay(inorder,rootIndex+1,inEnd,postorder,postBegin+lenOfleft,postEnd-1,map); //右中 右后
return root;
}
}
Leetcode105(从前序与中序遍历序列构造二叉树)
package tree;
import java.util.HashMap;
import java.util.Map;
public class Leetcode105 {
public static void main(String[] args) {
}
public static TreeNode findWay(int[] prorder,int[] inorder) {
Map<Integer,Integer> map = new HashMap<>();
for(int i =0;i<inorder.length;i++) {
map.put(inorder[i], i);
}
return travelWay(prorder,0,prorder.length,inorder,0,inorder.length,map);
}
public static TreeNode travelWay(int[] preorder,int prebegin,int preend,int[] inorder,int inbegin,int inend,Map<Integer,Integer> map) {
if(prebegin>=preend||inbegin>=inend) {
return null;
}
int rootIndex = map.get(preorder[0]);
TreeNode root = new TreeNode(inorder[rootIndex]);
int preofLeft = rootIndex-prebegin;
//3 9 20 15 7前
//9 3 15 20 7中
root.left = travelWay(preorder,prebegin+1,prebegin+preofLeft+1,inorder,inbegin,rootIndex,map);//左前序,左中序
root.right = travelWay(preorder,prebegin+preofLeft+1,preend,inorder,rootIndex+1,inend,map);
return root;
//5 4 1 2 6 7 8前
//1 4 2 5 7 6 8中
//1 2 4 7 8 6 5后
}
}