QUESTION
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
THINKING
利用中序遍历和后序遍历建立一个二叉树,考察数据结构的知识,递归。首先对后序从后往前进行遍历,取出元素作为根节点,然后找到根节点在中序遍历中的位置i,然后把i之后的数据作为右子树进行递归,把i之前的数据作为左子树进行递归。
CODE
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
Map<Integer,Integer> inorderMap = new HashMap<Integer,Integer>();
int postIndex = 0;//这里特别注意是全局变量
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder.length == 0 || postorder.length == 0)
return null;
postIndex = postorder.length - 1;
for(int i = 0;i < inorder.length;i++)
inorderMap.put(inorder[i],i);
return creatTree(postorder,0,inorder.length - 1);
}
public TreeNode creatTree(int[] postorder,int start,int end){
if(start > end )
return null;
TreeNode root = new TreeNode(postorder[postIndex--]);//依次遍历后续数组中的数
if(start == end)
return root;
int inIndex = inorderMap.get(root.val);//查找根节点在前序数组中的位置
root.right = creatTree(postorder,inIndex + 1,end);
root.left = creatTree(postorder,start,inIndex - 1);
return root;
}
}
RESULT
runtime complexity is ?