Given inorder and postorder traversal of a tree, construct the binary tree.
You may assume that duplicates do not exist in the tree.
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//从中序与后序遍历构建树,思想与上一题一样
//唯一区别是后序遍历的尾为root,而先序遍历的首为root
public class Solution {
public int findRoot(int[] inorder, int key){ //在中序遍历中定位root
if(inorder.length==0) return -1;
int index = -1;
for(int i=0; i<inorder.length; i++){
if(inorder[i]==key){
index = i; break;
}
}
return index;
}
//通过递归实现构建树的主逻辑
public TreeNode buildTree(int[] inorder, int[] postorder, int instart, int inend, int postart, int poend){
if(inorder.length==0 || postorder.length==0) return null;
if(instart > inend) return null;
TreeNode root = new TreeNode(postorder[poend]);
int index = findRoot(inorder, root.val);
root.left = buildTree(inorder, postorder, instart, index-1, postart, postart+index-1-instart);
root.right = buildTree(inorder, postorder, index+1, inend, postart+index-1-instart+1, poend-1);
return root;
}
//****leetcode主函数****
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder, postorder, 0, inorder.length-1, 0, postorder.length-1);
}
}