python实现二叉树的相关算法

这篇博客主要介绍了如何使用Python实现二叉树的前序、中序和后序遍历,以及如何通过前序+中序或中序+后序来求解另一种遍历顺序。博主提供了递归方式的代码实现,虽然算法逻辑不复杂,但对理解二叉树操作很有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的相关算法实现

概述

  二叉树,作为数据结构中重要的一员,掌握好其相关算法是非常有必要的。在本博客中,我将会用python实现二叉树的前序、中序以及后序遍历,同时也实现了利用前序+中序求后序,或者利用中序+后序求前序等相关操作。

代码

  话不多说,下面直接给代码,所有算法都用递归的方式求解,所以本身逻辑并不复杂,此处就不再详细解释其算法原理。

class Node:

    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None


class Traversal:

    def pre_order(self, root):
        if root:
            print(root.value, end=" ")
            self.pre_order(root.left)
            self.pre_order(root.right)

    def mid_order(self, root):
        if root:
            self.mid_order(root.left)
            print(root.value, end=" ")
            self.mid_order(root.right)

    def post_order(self, root):
        if root:
            self.post_order(root.left)
            self.post_order(root.right)
            print(root.value, end=" ")


class Solution:

    def get_post(self, pre_order, mid_order):
        if not pre_order:
            return
        root = Node(pre_order[0])
        pos = mid_order.index(pre_order[0])
        root.left = self.get_post(pre_order[1:pos+1], mid_order[0:pos])
        root.right = self.get_post(pre_order[pos+1:], mid_order[pos+1:])
        return root

    def get_pre(self, mid_order, post_order):
        if not post_order:
            return
        root = Node(post_order[-1])
        pos = mid_order.index(post_order[-1])
        root.left = self.get_pre(mid_order[:pos], post_order[:pos])
        root.right = self.get_pre(mid_order[pos+1:], post_order[pos:-1])
        return root


if __name__ == "__main__":
    # make a tree
    # root --> 0 
    #        /   \
    #       1     2
    #      / \   / \
    #     3   4 5   6
    root = Node(0)
    root.left = Node(1)
    root.right = Node(2)
    root.left.left = Node(3)
    root.left.right = Node(4)
    root.right.left = Node(5)
    root.right.right = Node(6)

    # test pre/mid/post traversal
    print("pre_order: ", end=" ")
    Traversal().pre_order(root)
    print()
    print("mid_order: ", end=" ")
    Traversal().mid_order(root)
    print()
    print("post_order: ", end=" ")
    Traversal().post_order(root)
    print()

    # test pre+mid ==> post
    pre = [0,1,3,4,2,5,6]
    mid = [3,1,4,0,5,2,6]
    res = Solution().get_post(pre, mid)
    print("post_order: ", end=" ")
    Traversal().post_order(res)
    print()

    # test mid+post ==> pre
    mid = [3,1,4,0,5,2,6]
    post = [3,4,1,5,6,2,0]
    res = Solution().get_pre(mid, post)
    print("pre_order: ", end=" ")
    Traversal().pre_order(res)
# res
#
# pre_order:  0 1 3 4 2 5 6 
# mid_order:  3 1 4 0 5 2 6 
# post_order:  3 4 1 5 6 2 0
# post_order:  3 4 1 5 6 2 0
# pre_order:  0 1 3 4 2 5 6
#

总结

不忘初心,砥砺前行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值