【秒杀办法】根据二叉树的先序遍历、中序遍历、后序遍历快速创建二叉树

博客探讨了如何根据二叉树的先序、中序和后序遍历来重建二叉树。提供了两种题型,分别是根据前序和中序,以及中序和后序遍历创建二叉树的例子。指出仅依赖先序和后序遍历无法唯一确定二叉树结构,因为它们只能确定根节点,无法区分左右子树。

镇楼:


 

先了解一下什么是先中后序遍历

先序遍历:根->左子树->右子树
中序遍历:左子树->根->右子树
后序遍历:左子树->右子树->根

题型一:

                根据二叉树的前序遍历和中序遍历创建一个二叉树

                  先序遍历:E F H I G J K

                  中序遍历:H F I E J K G

 

 

 

 


题型二:

                根据二叉树的中序遍历和后序遍历创建一个二叉树

                  中序遍历:B A D C E

                  后序遍历:B D E C A


 那么问题来了,根据二叉树的先序序列和后序序列能否创建出一个二叉树?

答案是肯定的,不能,原因是前序和后续只能确定根,无法确定左右子树

 

<think>嗯,用户的问题是根据二叉树和中序遍历来计算后序遍历。我需要回忆一下相关的二叉树遍历知识,然后思考如何通过这两种遍历结果来重建二叉树,进而得到后序遍历。 首序遍历的顺是根节点、左子树、右子树,而中序遍历是左子树、根节点、右子树。所以,序遍历的第一个元素肯定是整个树的根节点。然后在中序遍历中找到这个根节点,左边就是左子树的中序遍历结果,右边是右子树的中序遍历结果。接下来,可以通过递归的方法分别处理左子树和右子树。 举个例子,假设是[3,9,20,15,7],中是[9,3,15,20,7]。的第一个元素3是根节点。在中中,3左边的9是左子树的中,右边的15,20,7是右子树的中。然后,左子树的应该是中根之后的部分,长度和中左子树的长度相同,也就是9。右子树的则是剩下的20,15,7。这样递归下去,就能重建整个二叉树的结构。重建之后再进行后序遍历,就能得到结果了。 不过要注意边界条件,比如当左子树或右子树为空的时候,递归应该停止。另外,如何高效地在中序遍历中找到根节点的位置?可能需要用哈希表来存储中序遍历的值和索引,这样查找起来更快,时间复杂度更低。 用户可能还需要具体的实现步骤或者代码示例。根据引用的内容,比如引用[2]提到了递归和非递归的实现方法,但这里可能需要用递归来重建二叉树,然后再进行后序遍历。所以代码部分应该包括构建二叉树和后续遍历两个部分。 还需要考虑输入的有效性,比如和中序遍历的长度是否一致,以及是否确实对应同一棵树。如果输入不合法,比如无法构建二叉树,应该如何处理这些错误情况。 另外,用户可能想知道时间复杂度和空间复杂度。构建哈希表是O(n)的时间,递归重建二叉树每个节点访问一次,所以时间复杂度是O(n)。空间复杂度主要是递归栈的深度,最坏情况下是O(n),平均是O(log n)(平衡二叉树的情况下)。 最后,生成相关问题的时候,可以考虑其他遍历组合的可能性,或者如何优化算法,或者实际应用场景。</think>### 通过和中序遍历计算后序遍历的方法 通过二叉树序遍历和中序遍历推导后序遍历的核心步骤为: 1. **确定根节点**:序遍历的第一个元素即为根节点值 2. **划分左右子树**:在中序遍历中找到根节点,左侧为左子树的中列,右侧为右子树的中列 3. **递归构建子树**:根据左右子树的长度,分割列为左子树和右子树 4. **生成后序遍历**:递归完成后序遍历的拼接顺为左子树后序 + 右子树后序 + 根节点 #### 算法实现(Python示例) ```python def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_idx = inorder.index(root_val) left_in = inorder[:root_idx] right_in = inorder[root_idx+1:] left_pre = preorder[1:1+len(left_in)] right_pre = preorder[1+len(left_in):] root = {'val': root_val} root['left'] = build_tree(left_pre, left_in) root['right'] = build_tree(right_pre, right_in) return root def postorder(root): if not root: return [] return postorder(root['left']) + postorder(root['right']) + [root['val']] # 示例输入 preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] tree = build_tree(preorder, inorder) print("后序遍历结果:", postorder(tree)) # 输: [9,15,7,20,3] ``` #### 关键说明 1. **时间复杂度**:$O(n^2)$(未使用哈希表优化),若用哈希表存储中索引可优化至$O(n)$[^2] 2. **边界条件**:当和中列不匹配时无法构建树(需额外校验) 3. **空间复杂度**:递归调用栈深度为树的高度,最坏情况下为$O(n)$[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值