![在这里插入图片描述](https://img-blog.csdnimg.cn/202004030912074.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hc29uOTc=,size_16,color_FFFFFF,t_70)
递归
- 我有一个方法,传入两个数组和数组的起始结束序号
- 根据第一个数组的第一个数,找到第二个数组相同数的序号num,即树的根
- 第二个数组num之前是左子树,num之后是右子树
- 递归得到根的left和right
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null) return null;
if (preorder.length == 0) return null;
return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode buildTree(int[] pre, int s1, int e1, int[] ino, int s2, int e2) {
if (s1 == e1) return new TreeNode(pre[s1]);
int num = 0;
for (int i = s2; i <= e2; i++) {
if (ino[i] == pre[s1]) {
num = i;
break;
}
}
int lefnum = num - s2;
int rignum = e2 - num;
TreeNode head = new TreeNode(pre[s1]);
if (num == s2) {
head.left = null;
head.right = buildTree(pre, s1 + lefnum + 1, e1, ino, num + 1, e2);
} else if (num == e2) {
head.left = buildTree(pre, s1 + 1, s1 + lefnum, ino, s2, num - 1);
head.right = null;
} else {
head.left = buildTree(pre, s1 + 1, s1 + lefnum, ino, s2, num - 1);
head.right = buildTree(pre, s1 + lefnum + 1, e1, ino, num + 1, e2);
}
return head;
}
}
一点小改进,在中序遍历数组中找头结点的序号很费时间,可以建立一个hashmap来缩短时间
class Solution {
HashMap<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null) return null;
if (preorder.length == 0) return null;
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode buildTree(int[] pre, int s1, int e1, int[] ino, int s2, int e2) {
if (s1 == e1) return new TreeNode(pre[s1]);
int num = map.get(pre[s1]);
int lefnum = num - s2;
int rignum = e2 - num;
TreeNode head = new TreeNode(pre[s1]);
if (num == s2) {
head.left = null;
} else {
head.left = buildTree(pre, s1 + 1, s1 + lefnum, ino, s2, num - 1);
}
if (num == e2) {
head.right = null;
} else {
head.right = buildTree(pre, s1 + lefnum + 1, e1, ino, num + 1, e2);
}
return head;
}
}