Python实现二叉树及其4种遍历

本文介绍了Python中二叉树的数据结构,并详细讲解了二叉树的定义、性质,重点探讨了二叉树的四种遍历方法:前根遍历、中根遍历、后根遍历和按层遍历,强调了理解和运用二叉树递归思想的重要性。

Python & BinaryTree

1. BinaryTree (二叉树)

二叉树是有限个元素的集合,该集合或者为空、或者有一个称为根节点(root)的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。
  • 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
  • 二叉树的第i层至多有2^{i-1}个结点
  • 深度为k的二叉树至多有2^k-1个结点;
  • 对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

2. 二叉树

这里写图片描述


  • 生成二叉树
# init a tree
def InitBinaryTree(dataSource, length):
    root = BTNode(dataSource[0])

    for x in xrange(1,length):
        node = BTNode(dataSource[x])
        InsertElementBinaryTree(root, node)
    return root
    print 'Done...'
  • 前根遍历
# pre-order
def PreorderTraversalBinaryTree(root):
    if root:
        print '%d | ' % root.data,
        PreorderTraversalBinaryTree(root.leftChild)
        PreorderTraversalBinaryTree(root.rightChild)
### 二叉树遍历实现二叉树遍历中,前序、中序和后序遍历是三种基本的深度优先遍历方式。每种遍历方式都有其特定的应用场景和特点。以下是这三种遍历方式的递归实现。 #### 前序遍历 前序遍历的顺序是:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def pre_order_traversal(root): if root: print(root.val, end=' ') pre_order_traversal(root.left) pre_order_traversal(root.right) ``` #### 中序遍历 中序遍历的顺序是:先递归遍历左子树,然后访问根节点,最后递归遍历右子树。对于二叉搜索树来说,中序遍历的结果是一个有序的序列[^3]。 ```python def in_order_traversal(root): if root: in_order_traversal(root.left) print(root.val, end=' ') in_order_traversal(root.right) ``` #### 后序遍历 后序遍历的顺序是:先递归遍历左子树,然后递归遍历右子树,最后访问根节点。 ```python def post_order_traversal(root): if root: post_order_traversal(root.left) post_order_traversal(root.right) print(root.val, end=' ') ``` #### 示例代码 以下是一个完整的示例,展示了如何构建一个简单的二叉树并进行前序、中序和后序遍历: ```python # 构建一个简单的二叉树 # 1 # / \ # 2 3 # / \ # 4 5 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) print("前序遍历:") pre_order_traversal(root) # 输出: 1 2 4 5 3 print("\n中序遍历:") in_order_traversal(root) # 输出: 4 2 5 1 3 print("\n后序遍历:") post_order_traversal(root) # 输出: 4 5 2 3 1 ``` ### 遍历结果分析 - **前序遍历**的结果是 `1 2 4 5 3`,表示首先访问根节点 `1`,然后依次访问左子树和右子树。 - **中序遍历**的结果是 `4 2 5 1 3`,表示先访问左子树,再访问根节点,最后访问右子树。 - **后序遍历**的结果是 `4 5 2 3 1`,表示先访问左子树,再访问右子树,最后访问根节点[^2]。 ### 相关问题 1. 如何使用非递归的方式实现二叉树的前序、中序和后序遍历? 2. 如何判断一棵二叉树是否为二叉搜索树? 3. 如何通过中序和后序遍历重建二叉树4. 如何通过前序和中序遍历重建二叉树? 5. 如何实现二叉树的层次遍历
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值