好久没写题了,写起来就有点不适应,上大学时知道怎么根据前序遍历和中序遍历来恢复一棵树,但是从来没有实现过,今天碰到了,终于把曾经留下的遗憾弥补了
public class ConstructBinaryTreefromPreorderandInorderTraversa {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0 || preorder.length != inorder.length){
return null;
}
return assistBuildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode assistBuildTree(int[] preorder,int pbegin,int pend,int[] inorder,int ibegin,int iend){
if(pbegin > pend){
return null;
}
int pivot = preorder[pbegin];
int i = ibegin;
//查找pivot在中序遍历中的位置
for(;i < iend;i ++){
if(inorder[i] == pivot){
break;
}
}
int leftLength = i - ibegin;
TreeNode root = new TreeNode(pivot);
//这里的开始下标和结束下标很重要
root.left = assistBuildTree(preorder, pbegin + 1, pbegin + leftLength, inorder, ibegin, i - 1);
root.right = assistBuildTree(preorder, pbegin + leftLength + 1, pend, inorder, i + 1, iend);
return root;
}
}
本文介绍了一种根据给定的前序遍历和中序遍历序列构建二叉树的方法,并提供了详细的Java代码实现。通过递归的方式确定根节点及其左右子树,最终恢复出完整的二叉树结构。
461

被折叠的 条评论
为什么被折叠?



