根据一棵树的前序遍历与中序遍历构造二叉树
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
示例1:
Java解法
package sj.shimmer.algorithm.m3_2021;
import java.util.Arrays;
import sj.shimmer.algorithm.TreeNode;
/**
* Created by SJ on 2021/3/21.
*/
class D55 {
public static void main(String[] args) {
TreeNode root = buildTree(new int[]{3, 9, 20, 15, 7}, new int[]{9, 3, 15, 20, 7});
System.out.println(root);
}
public static TreeNode buildTree(int[] preorder, int[] inorder) {
//- 前序遍历[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
//- 中序遍历[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
if (preorder == null||preorder.length==0||inorder==null||inorder.length==0) {
return null;
}
int length = inorder.length;
for (int i = 0; i < length; i++) {
if (inorder[i]==preorder[0]) {
TreeNode root = new TreeNode(inorder[i]);
//左子树长度
int left = i;
//前序 左子树
int[] tempLeftP = Arrays.copyOfRange(preorder, 1, left+1);
int[] tempLeftI = Arrays.copyOfRange(inorder, 0, left);
root.left = buildTree(tempLeftP, tempLeftI);
//前序 右子树
int[] tempRightP = Arrays.copyOfRange(preorder, left+1, length);
int[] tempRightI = Arrays.copyOfRange(inorder, left+1, length);
root.right = buildTree(tempRightP, tempRightI);
return root;
}
}
return null;
}
}
官方解
-
递归
- 时间复杂度:O(n)
- 空间复杂度:O(n)
-
迭代