本题是已知二叉树的前序遍历和中序遍历来构建一个二叉树。依然是一道关于二叉树的题目。本题我是按照递归的方式来编写代码。
具体思路:
1.确定传入参数
本题很明显传入的参数就是一个前序遍历的数组和一个中序遍历的数组。
2.确定终止条件
那么很明显前序数组与中序数组的数组长度肯定是一致的。
若数组的长度为0,那么直接返回一个空的二叉树。
若数组长度为1,那就说明这个二叉树只有一个节点,也就是根结点,直接return root
3.确定单层递归逻辑
这一步是最关键的。
例如
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
在这里通过一个例子说明:
我们知道前序遍历的顺序为中左右,那么在前序遍历的数组中的第一个元素那自然就是根结点(中间结点)。在这个例子中,那么我们要构建的二叉树的根节点就是3。
然后再看中序遍历,中序遍历的顺序为左中右,所以我们在中序遍历中找到中间结点root的位置,那么root的左边就是他的左子树,右边就是他的右子数。
所以我们可以通过中间节点,分别将前序和中序数组分为左,中,右三个部分。
本例子中,在前序遍历找到中间节点3,
在中序中将数组分为[9][3][15,20,7](左,中,右)
在前序中将数组分为[3][9][20,15,7](中,左,右)
那么现在,我们又同时拥有了左子树和右子树的前序遍历和中序遍历。
所以自然就可以想到递归了。
我们传入左子树的前序和后续数组递归,就可以构建出左子树
传入右子树的前序和后续数组递归,就可以构建出右子树
最终返回我们所创建的二叉树的根结点root。
以上思路是我个人对于这道题目的理解,如果有什么不对的地方或者可以修改的地方希望大家多多指出。
希望可以通过这种方式来记录每天的刷题日常,大家一起进步。
以下是我的代码:(下次一定加注释)
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int len=preorder.length;
if(len==0)return null;
TreeNode root=new TreeNode(preorder[0]);
if(root==null)return null;
if(preorder.length==1)return root;
int index=0;
int nodeval=preorder[0];
for(index=0;index<len;index++){
if(inorder[index]==nodeval){
break;
}
}
int[] leftpreorder=new int[index];
int[] leftinorder=new int[index];
for(int i=0;i<leftpreorder.length;i++){
leftpreorder[i]=preorder[i+1];
}
for(int j=0;j<leftinorder.length;j++){
leftinorder[j]=inorder[j];
}
int[] rightpreorder=new int[len-1-index];
int[] rightinorder=new int[len-1-index];
for(int m=0;m<rightpreorder.length;m++){
rightpreorder[m]=preorder[index+1+m];
}
for(int n=0;n<rightinorder.length;n++){
rightinorder[n]=inorder[index+1+n];
}
root.left=buildTree(leftpreorder,leftinorder);
root.right=buildTree(rightpreorder,rightinorder);
return root;
}
}