LeetCode 题解:105. 从前序与中序遍历序列构造二叉树,Simple O(n) without map,JavaScript,详细注释
原题连接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
解题思路:
参考了[Simple O(n) without map](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/discuss/34543/Simple-O(n))。
我们可以用如下代码,打印出递归经过的所有路径:
先考虑这样一个二叉树:
前序遍历:[0,1,2]
中序遍历:[1,0,2]
打印结果如下:
以及这样一个二叉树:
前序遍历:[0,1,3,4,2,5,6]
中序遍历:[3,1,4,0,5,2,6]
打印结果如下:
一前序遍历:
[0,1,2]
说明,这个解法有以下特点:
* 始终用前序遍历来创建根节点和左子节点。
* 将创建节点的值传入左子节点的递归,这样就标记了这个节点已被创建过。
* 将 stop 的值传入右子节点的递归,是因为右子节点的递归会运行在左子节点的递归之后,也就是它必须判断它上一次递归创建节点的值。
* 当左子节点的递归走到preorder
的 0 和 1 位置时,此时它们两个节点肯定都没有被创建过,因此可以被正常创建节点,并且 1 会被链接到 0 的左子节点上。
* 当右子节点的递归走到 0、1 时,0、1 位置都已被创建过节点,会退出递归。
* 只有在右子节点的递归走到 2 时,此时preorder[2]
还未被创建过节点,此时会被创建并链接到右子节点。
* 不断重复上面的过程,就可以保证左右节点都被连接到正确位置。
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/fef2936a811ca42b2f0ef5767】。文章转载请联系作者。
评论