关于二叉树的知识,根据二叉树写出先序、中序、后序;根据先序、中序画出相应二叉树;...

本文深入探讨了二叉树的三种遍历方式:前序、中序和后序,并通过一个具体的例子展示了如何根据前序和中序遍历结果重建二叉树并求得后序遍历的序列。

直接进入主题,不介绍二叉树的基本知识。

先序:先根再左后右

中序:先左再根后右

后序:先左再右后根

思考技巧:递归思想

面试题:

7,已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为( )
A.GEDHFBCA
B.DGEBHFCA
C.ABCDEFGH
D.ACBFEDHG

答案:B
二叉树的遍历有3种:前序、中序和后序。
先序:先访问根结点、左结点、右结点
中序:先访问左结点、根结点、右结点
后序:先访问左结点、右结点、根结点

解析:

先根据前序和中序画出二叉树:

 

至此,二叉树结束;

 

转载于:https://www.cnblogs.com/ncl-960301-success/p/10472058.html

### 如何通过二叉树遍历和中遍历计算后序遍历 要通过二叉树遍历和中遍历来推导后序遍历,可以利用以下方法: #### 方法概述 1. **遍历的特**:访问根节,再依次访问左子树和右子树。 2. **中遍历的特**:访问左子树,接着访问根节,最后访问右子树。 3. **后序遍历的特**:访问左子树,再访问右子树,最后访问根节。 给定遍历和中遍历结果,可以通过递归的方式构建二叉树并得到其后序遍历结果。具体过程如下: --- #### 实现逻辑 - 首,在遍历的第一个元素即为当前子树的根节[^1]。 - 接着,在中遍历中找到该根节的位置,从而划分左子树和右子树对应的范围[^2]。 - 对于左子树和右子树分别重复上述操作,直到处理完所有的节。 - 最终按照后序遍历的顺(左 -> 右 -> 根),收集所有节即可获得完整的后序遍历列。 以下是基于 Python 的代码实现: ```python class TreeNode: def __init__(self, val=0): self.val = val self.left = None self.right = None def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_index_in_inorder = inorder.index(root_val) root = TreeNode(root_val) # 构建左子树 root.left = build_tree( preorder[1:root_index_in_inorder + 1], inorder[:root_index_in_inorder] ) # 构建右子树 root.right = build_tree( preorder[root_index_in_inorder + 1:], inorder[root_index_in_inorder + 1:] ) return root def post_order_traversal(root): result = [] stack = [(root, False)] while stack: node, visited = stack.pop() if node is None: continue if visited: result.append(node.val) else: stack.append((node, True)) stack.append((node.right, False)) stack.append((node.left, False)) return result # 测试用例 preorder = [3, 9, 20, 15, 7] inorder = [9, 3, 15, 20, 7] tree_root = build_tree(preorder, inorder) postorder_result = post_order_traversal(tree_root) print(postorder_result) # 输应为 [9, 15, 7, 20, 3] ``` --- #### 关键解析 1. **时间复杂度分析**:由于每次都需要查找根节在中遍历中的位置,因此整体的时间复杂度为 \(O(n^2)\),其中 \(n\) 是节的数量。如果采用哈希表存储遍历索引,则可以优化至 \(O(n)\)2. **空间复杂度分析**:递归调用栈的空间需求取决于树的高度,最坏情况下可能达到 \(O(n)\)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值