Construct Binary Tree from Inorder and Postorder Traversal
问题:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
解决:
【解析】以1,2,3,4,5,6,7为例构造树:
可以发现的规律是:
1. 后序遍历的从右数第一个为整棵树的根节点。
2. 中序遍历中根节点是左子树右子树的分割点。
3. 左右子树也有如上规律。
① 给定中序和后序遍历的结果,构造树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution { //21ms
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder,0,inorder.length - 1,postorder,0,postorder.length - 1);
}
public TreeNode buildTree(int[] inorder,int inStart,int inEnd,int[] postorder,int postStart,int postEnd){
if(inStart > inEnd || postStart > postEnd){
return null;
}
int rootVal = postorder[postEnd];
int rootIndex = 0;
for (int i = inStart;i <= inEnd ;i ++ ) {
if(inorder[i] == rootVal){
rootIndex = i;
break;
}
}
int llen = rootIndex - inStart;
TreeNode root = new TreeNode(rootVal);
root.left = buildTree(inorder,inStart,rootIndex - 1,postorder,postStart,postStart + llen - 1);
root.right = buildTree(inorder,rootIndex + 1,inEnd,postorder,postStart + llen,postEnd - 1);
return root;
}
}
② 在discuss中看到的,从后向前遍历。
class Solution { //1ms
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder,inorder.length - 1,0,postorder,postorder.length - 1);
}
private TreeNode buildTree(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart){
if(inEnd > inStart){
return null;
}
TreeNode root = new TreeNode(postorder[postStart]);
if(inEnd == inStart){
return root;
}
int i = 0;
for(i = inStart; i >= inEnd; i --){
if(inorder[i] == root.val){
break;
}
}
root.right = buildTree(inorder,inStart,i + 1, postorder, postStart - 1);
root.left = buildTree(inorder,i - 1, inEnd, postorder, postStart - (inStart - i) - 1);
return root;
}
}