一 半 高 雅 ,一 半 俗
大家好,我是爱动漫更爱编程的小工同学~
全文目录
🎁题目分析
💡思路点拨
🏆参考代码
🚀每日一图
🎁题目分析
二叉树的重组问题大致分为两种:前序+中序,中序+后序,然后我们来说说它们的作用,前序和后序的作用一般是用来寻找根节点,中序的作用做事区分左右子树的,所以如果只有前序和后序是无法构建二叉树的。
所以本题的关键就在于:如何在前序遍历找到中序遍历中确定根节点,以及如果划分左右子树的区间
💡思路点拨
前序遍历的第一个节点就是根节点,然后我们在遍历中序遍历找到根节点的位置,并且记录以便后面进行区间的划分。
根据上图我们可以得到:
root.left=build(preorder,preStart+1,preStart+leftSize, inorder,inStart,index-1);
root.right=build(preorder,preStart+leftSize+1,preEnd, inorder,index+1,inEnd);
带有递归函数的题,首先要明确递归函数的语义和递归的出口,比如本题的递归语义就是:给我前序遍历的结果和中序遍历的结果,我就可以重建一个二叉树,具体怎么不需要你关心,因为在写递归函数时一些限制语句已经帮你完成了。听起来是不是很模糊的样子?
所以我建议先当成最简单的情况来想
不理解的同学,可以把此图带入代码,让自己稍微熟悉一下这个递归函数的流程。虽然不建议搞清递归流程,但是对于才接触的人来说很是很有必要的,毕竟如果我连引擎都没见过,你就让我造汽车,这不是天方夜谭嘛?
🏆参考代码(Java版)
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return Build(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
TreeNode Build(int []preorder,int preStart,int preEnd,int[]inorder,int inStart,int inEnd)
{ //递归的结束条件
if(preStart>preEnd)
{
return null;
}
//先找到根节点
int rootVal=preorder[preStart];
int index=0;
for(int i=inStart;i<=inEnd;i++)
{
if(inorder[i]==rootVal)
{
//记录根节点在中序遍历中的位置
index=i;
break;
}
}
//左子树区间
int leftSize=index-inStart;
//构建根节点
TreeNode root=new TreeNode(rootVal);
//重建左子树
root.left=Build(preorder,preStart+1,preStart+leftSize,inorder,inStart,index-1);
//重建右子树
root.right=Build(preorder,preStart+leftSize+1,preEnd,inorder,index+1,inEnd);
return root;
}
}
🚀每日一图