学会这一道,大部分的树的问题都可以解决,除了关于树图的问题
根据一棵树的前序遍历与中序遍历构造二叉树。 注意:
你可以假设树中没有重复的元素。
例如:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/
9 20
/
15 7
思路:
首先了解概念
前序遍历:中 左 右 遍历树,中在最前
中序遍历:左 中 右 遍历树,中在中间
那么,前序遍历的数组中的每个元素都可以将中序遍历的数组划分为左子树数组和右子树数组
比方说,上面的举例,取出前序遍历的3,那么中序遍历数组就可以被划分为:
[9] [3] [15,20,7]
是不是想到用递归就可以做啦
事实上,凡是树的问题,90%以上都可以用递归
[3]生成树之后,在对它左子树和右子树做同样操作即可
代码:
int
复杂度:
时间:O(nlogn)
空间:O(n)
上面的速度太慢,羞耻
我们稍微优化下,将找划分位置的地方修改下,通过HashMap存储中序遍历所有元素的位置
这样查找只需要O(1)的速度
代码:
int
复杂度:
时间:O(n)
空间:O(n)
打完收工(*^_^*)