算法训练(重建二叉树)
题目
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
链接: leetcode.cn/problems/zh…
思路
先说一下二叉树的三种遍历方式
1.前序遍历
先遍历根节点,然后遍历左子树,最后遍历右子树
2.中序遍历
先遍历左子树,然后遍历根节点,最后遍历右子树
3.后序遍历
先遍历左子树,然后遍历右子树,最后遍历根节点
以上操作可通过递归加队列进行实现
知道了这些之后我们可以看出前序遍历结果的第一个值就是该二叉树的根节点,再根据中序遍历的结果,我们可以找到二叉树的左子树与右子树,
然后点用递归函数即可
代码实现
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//首先需要判断二叉树是不是为空
if(preorder == null || preorder.length == 0) return null;
//根节点
int rootValue = preorder[0];
int len = preorder.length;
int rootIndex = 0;
//找到根节点在中序遍历中的下标
for(int i = 0; i < len; i++) {
if(inorder[i]==rootValue) {
rootIndex = i;
break;
}
}
//创建二叉树
TreeNode head = new TreeNode(rootValue);
//左子树的创建
head.left = buildTree(Arrays.copyOfRange(preorder,1,rootIndex+1),Arrays.copyOfRange(inorder,0,rootIndex));
//右子树的创建
head.right = buildTree(Arrays.copyOfRange(preorder,rootIndex+1,len),Arrays.copyOfRange(inorder,rootIndex+1,len));
return head;
}
}