python创建二叉树及前中后序、层次遍历

"""
二叉树的创建:
(1)实现二叉树的链式存储结构,创建二叉树
(2)二叉树的前中后序遍历
"""


class BinTree:
    # 二叉树的节点结构,包括存储数据、左指针、右指针
    class TreeNode:
        __slots__ = {'_element', '_left', '_right'}

        def __init__(self, element, left=None, right=None):
            self._element = element
            self._left = left
            self._right = right

    # 二叉树的初始化,初始时为空树,根节点为空
    # ls用于存储节点地址
    def __init__(self):
        self.root = None
        self.ls = []

    # 二叉树的节点插入操作,以创建完全二叉树的形式
    def add(self, data):
        node = self.TreeNode(data)
        # 如果根节点为空,创建根节点,并将根节点写入列表ls中
        if self.root is None:
            self.root = node
            self.ls.append(self.root)
        else:  # 如果根节点存在,就需要创建根节点的孩子
            rootNode = self.ls[0]
            if rootNode._left is None:
                rootNode._left = node
                self.ls.append(rootNode._left)
            elif rootNode._right is None:
                rootNode._right = node
                self.ls.append(rootNode._right)
                self.ls.pop(0)  # 弹出第一个位置的元素,也就是保证每次循环的第一个节点是接下来插入位置的父母节点

    # 前序遍历,根左右
    def preOrderTraversal(self, root):
        if root is None:
            return
        print(root._element, end=' ')
        self.preOrderTraversal(root._left)
        self.preOrderTraversal(root._right)

    # 中序遍历,左根右
    def inOrderTraversal(self, root):
        if root is None:
            return
        self.inOrderTraversal(root._left)
        print(root._element, end=' ')
        self.inOrderTraversal(root._right)

    # 后序遍历,左右根
    def postOrderTraversal(self, root):
        if root is None:
            return
        self.postOrderTraversal(root._left)
        self.postOrderTraversal(root._right)
        print(root._element, end=' ')

    # 层次遍历,也叫广度优先遍历
    def levelOrderTraversal(self, root):
        if root is None:
            return
        queue = []
        result = []
        node = root
        queue.append(node)
        while queue:
            node = queue.pop(0)
            result.append(node._element)
            if node._left is not None:
                queue.append(node._left)
            if node._right is not None:
                queue.append(node._right)
        for i in result:
            print(i, end=' ')

验证:创建一个序号为1-10的完全二叉树

from eighth_chapter.BinTree import BinTree


def createTree(tree):
    for i in range(1, 11):
        tree.add(i)


if __name__ == '__main__':
    bintree = BinTree()
    createTree(bintree)
    print('前序遍历:', end='')
    bintree.preOrderTraversal(bintree.root)
    print()
    print('中序遍历:', end='')
    bintree.inOrderTraversal(bintree.root)
    print()
    print('后序遍历:', end='')
    bintree.postOrderTraversal(bintree.root)
    print()
    print('层次遍历:', end='')
    bintree.levelOrderTraversal(bintree.root)

结果:
E:\python数据结构与算法\day\Scripts\python.exe E:/python数据结构与算法/eighth_chapter/createTree.py
前序遍历:1 2 4 8 9 5 10 3 6 7 
中序遍历:8 4 9 2 10 5 1 6 3 7 
后序遍历:8 9 4 10 5 2 6 7 3 1 
层次遍历:1 2 3 4 5 6 7 8 9 10 
Process finished with exit code 0
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二叉树的遍历方式有四种,分别是先序遍历中序遍历后序遍历层次遍历先序遍历:从根节点开始,先访问根节点,再访问左子树,最后访问右子树。 中序遍历:从根节点开始,先访问左子树,再访问根节点,最后访问右子树。 后序遍历:从根节点开始,先访问左子树,再访问右子树,最后访问根节点。 层次遍历:从根节点开始,按照树的层次依次遍历每个节点。 以下是Python实现二叉树的遍历的代码示例: ```python # 定义二叉树节点 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 先序遍历 def preorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return res.append(node.val) dfs(node.left) dfs(node.right) dfs(root) return res # 中序遍历 def inorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) res.append(node.val) dfs(node.right) dfs(root) return res # 后序遍历 def postorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) dfs(node.right) res.append(node.val) dfs(root) return res # 层次遍历 def levelOrder(root: TreeNode) -> List[List[int]]: res = [] if not root: return res queue = [root] while queue: level = [] for i in range(len(queue)): node = queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level) return res ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楊木木8023

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

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

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

打赏作者

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

抵扣说明:

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

余额充值