用Python实现二叉树相关

本文介绍了一种二叉树的实现方式,并详细解释了广度优先、先序、中序和后序四种遍历方法。通过具体的代码实例,展示了如何在Python中创建二叉树并进行遍历。

代码如下:

class Node(object):
    """"""
    def __init__(self, item):
        self.elem = item
        self.lchild = None
        self.rchild = None

class Tree(object):
    """二叉树"""
    def __init__(self):
        self.root = None

    def add(self, item):
        node = Node(item)
        if self.root is None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)

    def breadth_travel(self):
        """广度遍历"""
        if self.root is None:
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.elem, end=" ")
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

    def preorder(self, node):
        """先序遍历"""
        if node is None:
            return
        print(node.elem, end=" ")
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self, node):
        """中序遍历"""
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.elem, end=" ")
        self.inorder(node.rchild)

    def postorder(self, node):
        """后序遍历"""
        if node is None:
            return
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.elem, end=" ")


if __name__ == "__main__":
    tree = Tree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.breadth_travel()
    print(" ")
    tree.preorder(tree.root)
    print(" ")
    tree.inorder(tree.root)
    print(" ")
    tree.postorder(tree.root)
    print(" ")
### 二叉树的定义与节点结构 在 Python实现二叉树,首先需要定义树的节点结构。每个节点通常包含一个数据字段以及指向左右子节点的引用[^3]。例如: ```python class Node: def __init__(self, data): self.data = data self.left = None self.right = None ``` 该类定义了具有 `data` 属性和两个子节点 `left` 和 `right` 的节点。 ### 手动构建二叉树实例 对于已知结构的二叉树,可以手动创建节点并连接它们来构造整棵树[^4]。以下代码展示了如何构建一棵如图所示的二叉树: ```python # 构建二叉树 tree = Node(3) tree.left = Node(5) tree.right = Node(1) tree.left.left = Node(6) tree.left.right = Node(2) tree.right.left = Node(0) tree.right.right = Node(8) tree.left.right.left = Node(7) tree.left.right.right = Node(4) ``` 这种方式适用于测试特定结构或验证算法逻辑。 ### 动态创建二叉树 若希望根据输入动态生成二叉树,则可以通过迭代器方式读取输入流中的值,并递归地创建节点[^1]。这种方法常见于在线评测系统中处理构造二叉树的问题: ```python def build_tree(data_iter): try: val = next(data_iter) if val == '#': # 使用 '#' 表示空节点 return None node = Node(val) node.left = build_tree(data_iter) node.right = build_tree(data_iter) return node except StopIteration: return None # 示例输入:3 5 6 # # 2 7 # # 4 # # 1 0 # # 8 # # data = list(map(int, input().split())) iterator = iter(data) root = build_tree(iterator) ``` 此方法允许用户以先序遍历的方式提供输入,并使用特殊字符(如 `#`)表示空指针。 ### 实现基本遍历操作 为了验证二叉树是否正确构建,可实现几种常见的遍历方式:前序、中序、后序及层次遍历。下面展示其中一种遍历函数——后序遍历: ```python def post_order_traversal(node): if node is not None: post_order_traversal(node.left) post_order_traversal(node.right) print(node.data, end=' ') ``` 类似的,也可以编写中序和前序遍历函数。此外,还可以采用队列结构实现层次遍历: ```python from collections import deque def level_order_traversal(root): queue = deque([root]) while queue: current = queue.popleft() print(current.data, end=' ') if current.left: queue.append(current.left) if current.right: queue.append(current.right) ``` 这些遍历方法有助于确认树的结构完整性及其功能性。 ### 遍历结果输出示例 当对上述构建的二叉树执行不同类型的遍历时,将得到如下输出: - 后序遍历:6 7 4 2 5 0 8 1 3 - 中序遍历:6 5 7 2 4 3 0 1 8 - 前序遍历:3 5 6 2 7 4 1 0 8 - 层次遍历:3 5 1 6 2 0 8 7 4 通过比较预期与实际输出,能够有效检验程序逻辑是否正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值