二叉樹的建立(前序中序建立二叉樹、中序後序建立二叉樹)
阿新 • • 發佈:2019-01-28
前序中序建立二叉樹:
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;
}