题目105从前序与中序遍历序列构造二叉树
据一棵树的前序遍历与中序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
用例
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
解题思路
- 利用递归,结合中序遍历与前序遍历地关系,前序遍历第一个节点为头节点,找出在中序遍历中的位置可以划分左右子树
最后的方法为O(N**2),可以利用map把时间复杂度降到O(N) - 迭代法
- 我们用一个栈和一个指针辅助进行二叉树的构造。初始时栈中存放了根节点(前序遍历的第一个节点),指针指向中序遍历的第一个节点;
- 我们依次枚举前序遍历中除了第一个节点以外的每个节点。如果 index 恰好指向栈顶节点,那么我们不断地弹出栈顶节点并向右移动
index,并将当前节点作为最后一个弹出的节点的右儿子;如果 index 和栈顶节点不同,我们将当前节点作为栈顶节点的左儿子; - 无论是哪一种情况,我们最后都将当前的节点入栈。
迭代法来自eetcode题解
代码
1 | class TreeNode: |
题目
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
用例
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
解题思路
利用后序遍历与中序遍历的关系,后序遍历最后一个为根,可以通过中序遍历找到其左右子树
代码
1 | class Solution3: |
题目
返回与给定的前序和后序遍历匹配的任何二叉树。
pre 和 post 遍历中的值是不同的正整数。
用例
pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
解题思路
前序遍历第一个为根,后面紧跟的第一个数为其左子树根节点(如果没有左子树,则为右子树根节点),可以在后序遍历中找到他的左右子树范围
代码
1 | class Solution: |
本文作者:
ketsudou
发布时间: 2020-05-22
最后更新: 2020-05-22
本文标题: leetcode-10
本文链接: http://huangketsudou.github.io/2020/05/22/leetcode-day10/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处
发布时间: 2020-05-22
最后更新: 2020-05-22
本文标题: leetcode-10
本文链接: http://huangketsudou.github.io/2020/05/22/leetcode-day10/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处