原题
Given inorder and postorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
原题链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
思路分析
此题与题105的解题思路基本一致:http://blog.csdn.net/wangt443/article/details/52036627
后序遍历:[ 左子树 右子树 根节点 ]
中序遍历:[ 左子树 根节点 右子树]
因此,解题思路为:
1、后序遍历的第最后一个节点为根节点;
2、中序遍历中可找到根节点,在根节点之前的为左子树的节点,在根节点之后的为右子树的节点;
3、知道了左子树的节点个数与右子树的节点个数后,可以找到后序遍历中左子树节点与右子树节点;
4、递归终止条件为后序遍历仅有一个节点,此时该节点即为根节点。
代码
public class Solution106_recursive {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTreeHelper(0, postorder.length-1, 0 , inorder.length-1, inorder, postorder);
}
private TreeNode buildTreeHelper(int postStart, int postEnd, int inStart, int inEnd, int[] inorder, int[] postorder){
if (postEnd < 0 || inStart > inEnd)
return null;
TreeNode root = new TreeNode(postorder[postEnd]);
int inIndex = 0;
for (int i = inStart; i <= inEnd; i++){
if (inorder[i] == root.val)
inIndex = i;
}
root.left = buildTreeHelper(postStart, postStart+inIndex-inStart-1, inStart, inIndex-1, inorder, postorder);
root.right = buildTreeHelper(postEnd-inEnd+inIndex, postEnd-1, inIndex+1, inEnd, inorder, postorder);
return root;
}
}