每日一题:LeetCode-105. 从前序与中序遍历序列构造二叉树
刷题使我快乐,满脸开心.jpg
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
示例 2:
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
和inorder
均无重复
元素inorder
均出现在preorder
preorder
保证 为二叉树的前序遍历序列inorder
保证 为二叉树的中序遍历序列
思路
还是头一次思考构建树的问题,整理了下思路,发现其实考查的就是对于两种遍历方式的理解。
前序遍历:对于每一个节点及其左右子节点的组合来说,总是以
根->左->右
的顺序遍历节点中序遍历:对于每一个节点及其左右子节点的组合来说,总是以左->根->右
的顺序遍历节点
基于这个特性,我们再来看两个遍历方式的数组,就可以用这个思路来分解问题
对于一棵树来说,前序遍历的第一个元素即是树的根节点
对于中序遍历数组中,根节点左边的元素都是其左子树的元素;根节点右边的元素都是其右子树的元素
有了这个概念,我们就可以分解问题了:
一层层往下拆解子树,这就是递归方法的
递归条件
直到没有节点、仅剩一个节点,此时就可以直接返回了,这就是递归方法的
退出条件
至此,递归方法的要素就凑齐了,这里我的代码,不如官方解法简洁,但是感觉能更加直接的看出拆解左右子树的过程
另外放了官方递归的代码,方便看下更简洁的写法~
老样子,细节在代码注释了,上代码~
代码
个人递归解法
官方递归解法
版权声明: 本文为 InfoQ 作者【半亩房顶】的原创文章。
原文链接:【http://xie.infoq.cn/article/d1817e0b8e82ab8e1b3aba56e】。文章转载请联系作者。
评论