遍历序列构造二叉树

本文转载自:数据结构笔记——由遍历序列构造二叉树

一、二叉树的遍历序列的非唯一性

中序遍历

中序遍历左子树、根结点、中序遍历右子树

前序遍历

根结点、前序遍历左子树、前序遍历右子树

后序遍历

前序遍历左子树、前序遍历右子树、根结点

层序遍历

层序遍历只能用于完全二叉树
即利用二叉树性质,按照层序进行编号。
有下列特性:

  1. 1为根节点(不能为0)
  2. i的左节点为 $2i$,右节点为 $2i+1$

结论:若只给出一棵二叉树的前、中、后、层序遍历序列中的一种,不能唯一确定一棵二叉树

前序序列和后序序列却不一定能唯一地确定一棵二叉树 ——因为无法确定区分左右子树部分

二、由多个遍历序列构造唯一二叉树

1.前序+中序遍历序列

前序遍历序列:根结点 左子树的前序遍历序列 右子树的前序遍历序列

中序遍历序列:左子树的中序遍历序列 根结点 右子树的中序遍历序列

例1:

例2:

2.后序+中序遍历序列

后序遍历序列:左子树的中序遍历序列 右子树的中序遍历序列 根结点

中序遍历序列:左子树的中序遍历序列 根结点 右子树的中序遍历序列

例:

3.层序+中序遍历序列

层序遍历序列:根结点 左子树的根 右子树的根

中序遍历序列:左子树的中序遍历序列 根结点 右子树的中序遍历序列

例1:

例2:

4.若前序、后序、层序序列两两组合?

关键点在于无法找到根节点,无法由此划分出左右子树

三、总结

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遍历序列构造二叉树的方法有多种,下面介绍其中一种常用的方法。 假设已知一棵二叉树的前序遍历序列preorder和中序遍历序列inorder,我们可以通过以下步骤构造出这棵二叉树: 1. 如果preorder和inorder都为空,返回空树; 2. 前序遍历序列的第一个元素是当前子树的根节点; 3. 在中序遍历序列中找到根节点的位置,将inorder分成左子树的中序遍历序列和右子树的中序遍历序列; 4. 根据左子树的中序遍历序列和前序遍历序列,递归构造出左子树; 5. 根据右子树的中序遍历序列和前序遍历序列,递归构造出右子树; 6. 将左子树和右子树连接到根节点上,返回根节点。 具体实现可以参考以下Python代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): if not preorder or not inorder: return None # 前序遍历序列的第一个元素是当前子树的根节点 root_val = preorder[0] root = TreeNode(root_val) # 在中序遍历序列中找到根节点的位置 inorder_idx = inorder.index(root_val) # 递归构造左子树和右子树 root.left = buildTree(preorder[1:inorder_idx+1], inorder[:inorder_idx]) root.right = buildTree(preorder[inorder_idx+1:], inorder[inorder_idx+1:]) return root ``` 使用示例: ```python preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] root = buildTree(preorder, inorder) ``` 这样就可以根据给定的前序遍历序列和中序遍历序列构造出一棵二叉树了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值