Leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
题目链接: Construct Binary Tree from Inorder and Postorder Traversal
难度:Medium
题目大意:
根据一棵二叉树中序遍历和后序遍历的结果恢复出二叉树。
思路:
参考高赞回答。postorder的最后一个元素就是二叉树的根节点,找到根节点在inorder中的位置,inorder中根节点左边的所有元素就是根节点的左子树的所有元素,右边的所有元素就是右子树的所有元素。再把左子树和右子树看成新的二叉树,重复以上步骤进行递归。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer,Integer> map=new HashMap<>();
int index;//postorder的最后一个元素就是二叉树的根节点
//index表示根节点在postorder中的下标
public TreeNode buildTree(int[] inorder, int[] postorder) {
int n=inorder.length;
for(int i=0;i<n;i++){
map.put(inorder[i],i);
}//题目中限制了所有元素都互不相同
index=n-1;
return help(0,n-1,postorder);
}
public TreeNode help(int left,int right,int[] postorder){
if(left>right){
return null;
}
TreeNode root=new TreeNode(postorder[index]);
index--;
int rootIndex=map.get(root.val);//根节点在inorder中的下标
root.right=help(rootIndex+1,right,postorder);//递归
//需要先构建右子树,想想后续遍历的顺序
root.left=help(left,rootIndex-1,postorder);
return root;
}
}