前序中序创建二叉树:
preOrder:{1,2,4,7,3,5,6,8}
inOrder:{4,7,2,1,5,3,8,6}
- 找到中序中和先序相同的节点(i=3)、leftLen=i、rightLen=len-leftLen-1;
- 将先序和中序分为两半,递归调用:(preS+1,inS,leftLen,preorder,inorder) 和 (preS+leften+1,ins+leftlen+1,rightlen.preorder,inorder)
递归实现:
public static TreeNode createTree(int preS,int inS,int length,int[]preorder,int[]inorder){
if (preorder == null || preorder.length ==0){
return null;
}
TreeNode node = new TreeNode(preorder[preS]);
if(length ==1 && preorder[preS] == inorder[inS])
return node;
int i = 0;
//找到分界点
while (i <=length-1 && preorder[preS]!= inorder[inS+i])
i++;
//左半边长度
int leftLen = i;
//右半边长度
int rightLen = length-leftLen-1;
if(leftLen>=1){
node.left=createTree(preS+1,inS,leftLen,preorder,inorder);
}
if(rightLen>=1){
node.right=createTree(preS+leftLen+1,inS+leftLen+1,rightLen,preorder,inorder);
}
return node;
}
中序后序创建二叉树:
inOrder:{4,7,2,1,5,3,8,6}
postOrder={7,4,2,5,8,6,3,1}
- 找到中序中和后序相同的节点(i=3);
- 将中和后序分为两半,递归调用:(inS,postE-rightLen-1,leftLen,inorder,postorder)、createTree(inS+leftLen+1,postE-1,rightLen,inorder,postorder)
递归实现:
public TreeNode createTree(int inS,int postE,int length,int[]inorder,int[]postorder){
if (inorder == null || inorder.length ==0){
return null;
}
TreeNode node = new TreeNode(postorder[postE]);
if(length ==1 && inorder[inS] == postorder[postE])
return node;
int i = 0;
//找到分界点
while (i <=length-1 && postorder[postE]!= inorder[inS+i])
i++;
//左半边长度
int leftLen = i;
//右半边长度
int rightLen = length-leftLen-1;
if(leftLen>=1){
node.left=createTree(inS,postE-rightLen-1,leftLen,inorder,postorder);
}
if(rightLen>=1){
node.right=createTree(inS+leftLen+1,postE-1,rightLen,inorder,postorder);
}
return node;
}