文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 实现树结构的七种遍历

2023-01-31 07:49

关注
class BTree(object):
    def __init__(self, value=None, left=None, right=None):
        self.val = value
        self.left = left
        self.right = right
        self.dot = Digraph(comment='Binary Tree')


def create_BTree_By_List(array):
    i = 1
    # 将原数组拆成层次遍历的数组,每一项都储存这一层所有的节点的数据
    level_order = []
    sum = 1
    while sum < len(array):
        level_order.append(array[i - 1:2 * i - 1])
        i *= 2
        sum += i
    level_order.append(array[i - 1:])

    # BTree_list: 这一层所有的节点组成的列表
    # forword_level: 上一层节点的数据组成的列表
    def Create_BTree_One_Step_Up(BTree_list, forword_level):
        new_BTree_list = []
        i = 0
        for elem in forword_level:
            root = BTree(elem)
            if 2 * i < len(BTree_list):
                root.left = BTree_list[2 * i]
            if 2 * i + 1 < len(BTree_list):
                root.right = BTree_list[2 * i + 1]
            new_BTree_list.append(root)
            i += 1
        return new_BTree_list

    # 如果只有一个节点
    if len(level_order) == 1:
        return BTree(level_order[0][0])
    else:
        BTree_list = [BTree(elem) for elem in level_order[-1]]  # 创建最后一层的节点列表
        # 从下往上,逐层创建二叉树
        for i in range(len(level_order) - 2, -1, -1):
            BTree_list = Create_BTree_One_Step_Up(BTree_list, level_order[i])
        return BTree_list[0]


class TreeTraversal():
    @classmethod
    def preorderTraversal_re(cls, root):
        if not root: return []
        return [root.val] + cls.preorderTraversal_re(root.left) + cls.preorderTraversal_re(root.right)

    @classmethod
    def preorderTraversal(cls, root):
        if not root: return []
        res, stack = [], [root]
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.right: stack.append(node.right)
            if node.left: stack.append(node.left)
        return res

    @classmethod
    def inorderTraversal_re(cls, root):
        if not root: return []
        return cls.inorderTraversal_re(root.left) + [root.val] + cls.inorderTraversal_re(root.right)

    @classmethod
    def inorderTraversal(cls, root):
        if not root: return []
        res, stack = [], []
        while True:
            while root:
                stack.append(root)
                root = root.left
            if not stack: return res
            node = stack.pop()
            res.append(node.val)
            if node.right: root = node.right

    @classmethod
    def postorderTraversal_re(cls, root):
        if not root: return []
        return cls.postorderTraversal_re(root.left) + cls.postorderTraversal_re(root.right) + [root.val]

    @classmethod
    def postorderTraversal(cls, root):
        if not root: return []
        res, stack = [], [root]
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.left: stack.append(node.left)
            if node.right: stack.append(node.right)
        return res[::-1]



    @classmethod
    def levelOrder(cls, root):
        if not root: return []
        res, q = [], [root]
        while q:
            length = len(q)
            for _ in range(length):
                node = q.pop(0)
                res.append(node.val)
                if node.left: q.append(node.left)
                if node.right: q.append(node.right)
        return res


if __name__ == '__main__':
    array = [8, 6, 10, 5, 7, 9, 11]
    my_tree = create_BTree_By_List(array)
    my_tree.preorder()
    print(TreeTraversal.preorderTraversal_re(my_tree))
    print(TreeTraversal.preorderTraversal(my_tree))
    print(TreeTraversal.inorderTraversal_re(my_tree))
    print(TreeTraversal.inorderTraversal(my_tree))
    print(TreeTraversal.postorderTraversal_re(my_tree))
    print(TreeTraversal.postorderTraversal(my_tree))
    print(TreeTraversal.levelOrder(my_tree))
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯