一、题目
题目描述
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
二、分析
中序:DBEAC
后序:DEBCA
通过结合图片和中序,后序序列可以很清楚地看到A是这棵树的根节点,并且有左右子树,左子树中有B,D,E,而右子树中只有一个C。通过观察后序序列可以发现根节点位于此序列的最右端,而根节点在中序序列中的左边是它的左子树,右边是它的右子树。根据这样的特性得出以下代码:
public class ConstructBinaryTree {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/**
*
* @param inorder 中序序列
* @param postorder 后序序列
* @return
*/
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder == null || postorder == null || inorder.length != postorder.length)
return null;
int starti = 0;
int endi = inorder.length - 1;
int startp = 0;
int endp = postorder.length - 1;
TreeNode root = build(inorder, postorder, starti, endi, startp, endp);
return root;
}
public TreeNode build(int[] inorder, int[] postorder, int starti, int endi, int startp, int endp) {
if (starti > endi || startp > endp)
return null;
TreeNode root = new TreeNode(postorder[endp]);
int j = 0;
for (int i = starti; i <= endi; i++) {
if (root.val == inorder[i])
j = i;//记录root节点在中序遍历中的位置
}
int len = j - starti;//左的长度
//递归分别对root节点的左子树和右子树进行build
root.left = build(inorder, postorder, starti, j - 1, startp, startp + len - 1);
root.right = build(inorder, postorder, j + 1, endi, startp + len, endp - 1);
return root;
}
}
We should all be responsible for our own actions