一、问题描述:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
二、解决思路:
以下图为例:
中序遍历为: 4 7 2 1 5 3 8 6
后序遍历为: 7 4 2 5 8 6 3 1
我们可以看到 : 后序遍历的最后一个节点为根节点,即1是根节点。遍历中序可以得到左子树节点的数量。
在中序遍历中1的左边是1的左子树的中序 4 7 2, 那么7 4 2 就是左子树的后序
在中序遍历中1的右边是1的右子树的中序 5 3 8 6, 那么5 8 6 3就是右子树的后序
递归即可。
三、代码:
package T12;
/**
* @author 作者 : xcy
* @version 创建时间:2016年12月25日 下午3:14:33
* 类说明
*/
public class t106 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] inorder = { 4, 7, 2, 1, 5, 3, 8, 6 };
int[] postorder = { 7, 4, 2, 5, 8, 6, 3, 1 };
TreeNode root = buildTree(inorder, postorder);
System.out.println("done");
}
public static TreeNode buildTree(int[] inorder, int[] postorder) {
int inStart = 0;
int inEnd = inorder.length - 1;
int postStart = 0;
int postEnd = postorder.length - 1;
return genTree(inorder, inStart, inEnd, postorder, postStart, postEnd);
}
public static TreeNode genTree(int[] inorder, int ista, int iend, int[] postorder, int psta, int pend) {
// return
if (ista > iend || psta > pend) {
return null;
}
int r = postorder[pend];
TreeNode root = new TreeNode(r);
int k = 0;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == r) {
k = i;
break;
}
}
root.left = genTree(inorder, ista, k - 1, postorder, psta, psta + k - 1 - ista);
root.right = genTree(inorder, k + 1, iend, postorder, psta + k - 1 - ista - 1, pend - 1);
return root;
}
}