跳到主要内容

105.从前序与中序遍历序列构造二叉树

链接:105.从前序与中序遍历序列构造二叉树
难度:Medium
标签:树、数组、哈希表、分治、二叉树
简介:根据一棵树的前序遍历与中序遍历构造二叉树。

题解 1 - java

  • 编辑时间:2020-02-21
  • 执行用时:26ms
  • 内存消耗:76.4MB
  • 编程语言:java
  • 解法介绍:使用递归,通过切割数组进行遍历左右节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0)return null;
int center = preorder[0];
TreeNode node = new TreeNode(center);
int index=indexOf(inorder, center);
int left = index-0,right=inorder.length-1-index;
if(left!=0) {
node.left=buildTree(split(preorder,1,left), subString(inorder, 0,index));
}
if(right!=0) {
node.right=buildTree(subString(preorder,1+left), subString(inorder, index+1));
}
return node;
}
public int[] split(int[] arr,int start,int length) {
int[] newArr = new int[length];
for(int i=0;i<length;i++) {
newArr[i]=arr[start];
start++;
}
return newArr;
}
public int indexOf(int[] arr, int num) {
for (int i = 0, len = arr.length; i < len; i++) {
if (arr[i] == num)
return i;
}
return -1;
}
public int[] subString(int[] arr, int start) {
return subString(arr, start, arr.length);
}
public int[] subString(int[] arr, int start, int end) {
int length = end - start;
int[] newArr = new int[length];
for (int i = 0; i < length; i++) {
newArr[i] = arr[start];
start++;
}
return newArr;
}
}

题解 2 - python

  • 编辑时间:2024-02-20
  • 执行用时:137ms
  • 内存消耗:86.3MB
  • 编程语言:python
  • 解法介绍:dfs。
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
if not preorder: return None
index = inorder.index(preorder[0])
return TreeNode(
preorder[0],
self.buildTree(preorder[1:index + 1], inorder[:index]),
self.buildTree(preorder[index + 1:], inorder[index + 1:])
)