重建二叉树
根据前序遍历结果,和中序遍历结果来构建未知的二叉树
基础知识:
//二叉树的结构(java)
class TreeNode{
int val;
int left;
int right;
}
题目如下:
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
摘自:牛客
思路:
前序遍历,首先遍历根节点,所以二叉树的根即为:1,再看中序遍历,1左边{4,7,2}为根节点的左子树,1的右边{5,3,8,6}为根节点的右子树。
到上面的步骤我们已经基本分析完毕了,那么我们只需要,不断地把节点视为根节点,不断地分割,变成一个递归问题,那么我们需要的二叉树就可以根据前序和中序遍历的结果得到。
答案如下:
public TreeNode rebuild(int [] pre,int [] vin) {//pre前序遍历的结果,vin中序遍历的结果
if(pre.length==0||vin.length==0){
return null;
}
TreeNode root=new TreeNode(pre[0]);//首先添加根节点
for(int i=0;i<vin.length;i++){//通过中序遍历的结果,分开左右子树
if(vin[i]==pre[0]){//在中序遍历中找到根
// 左子树,注意 copyOfRange 函数,左闭右开,此函数作用为将一个数组复制给另外一个数组.
root.left= rebuild(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(vin,0,i));
// 右子树,注意 copyOfRange 函数,左闭右开
root.right=rebuild(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(vin,i+1,vin.length));
break;
}
}
return root;//树重建OK!
}
}
}
return root;//树重建OK!
}