【一起来刷Python题】——17.解决二叉树遍历问题

⭐今天是小年,祝所有人小年快乐!不知道南方习俗如何,今天我们北方人吃饺子。小年,虽可小憩,但还是要努力啊,至少要比昨天强!🌈⭐

问题描述:二叉树有三种遍历方式,先序遍历、中序遍历和后序遍历,其中的“先、中、后”指的是访问结点的顺序。遍历总体思路是将二叉树分成最小的子树,然后按照顺序输出。请编写一个Python程序,实现二叉树的递归遍历(实现先序、中序、后序、层次的遍历)。

 1)实现树的结构

程序代码:

class Node():
    def __init__(self, data=None):
        self._data = data
        self._left = None
        self._right = None
    def set_data(self, data):
        self._data = data
    def get_data(self):
        return self._data
    def set_left(self, node):
        self._left = node
    def get_left(self):
        return self._left
    def set_right(self, node):
        self._right = node
    def get_right(self):
        return self._right
if __name__ == '__main__':
    # 实例化结点
    root_node = Node()
    # 实例化根节点
    root_node.set_data('a')
    # 实例化左节点
    root_node.set_left('b')
    # 实例化右结点
    root_node.set_right('c')
    print(root_node.get_data(),root_node.get_left(),root_node.get_right())

2)递归遍历方案

程序代码:

# 实现数结构的类,树的结点有三个私有属性:左指针、右指针、自己的值
class Node():
    def __init__(self, data=None, left=None, right=None):
        self._data = data
        self._left = left
        self._right = right
# 先序遍历函数,遍历顺序:根、左、右
def pro_order(tree):
    if tree == None:
        return False
    print(tree._data)
    pro_order(tree._left)
    pro_order(tree._right)
# 中序遍历函数,遍历顺序:左、根、右
def mid_order(tree):
    if tree == None:
        return False
    mid_order(tree._left)
    print(tree._data)
    mid_order(tree._right)
# 后序遍历函数,遍历顺序:左、右、根
def pos_order(tree):
    if tree == None:
        return False
    pos_order(tree._left)
    pos_order(tree._right)
    print(tree._data)
# 层次遍历
def row_order(tree):
    queue = []
    queue.append(tree)
    while True:
        if queue == []:
            break
        print(queue[0]._data)
        first_tree = queue[0]
        if first_tree._left != None:
            queue.append(first_tree._left)
        if first_tree._right != None:
            queue.append(first_tree._right)
        queue.remove(first_tree)
if __name__ == '__main__':
    tree = Node('A', Node('B', Node('D', Node('H')), Node('E',Node('I'))), Node('C', Node('F'), Node('G')))
    print('先序遍历:')
    pro_order(tree)
    print('中序遍历:')
    mid_order(tree)
    print('后序遍历:')
    pos_order(tree)

程序分析:

        上例中所构建的二叉树如下图所示:

二叉树

 1)先序遍历的流程如下:

a 先访问根节点;b 访问左节点;c 访问右节点

完整顺序是:a(b(d(h))(e(i)))(c(f)(g))——abdheicfg;

2)中序遍历的流程如下:

a 先访问左节点;b 访问根节点;c 访问右节点

完整顺序是:((h)d)b((i)e))a((f)c(g))——hdbieafcg

3)后序遍历的流程如下:

a 先访问左节点;b 访问右节点;c 访问根节点

完整顺序是:((hd)(ie)b)(fgc)a——hdiebfgca

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花落指尖❀

您的认可是小浪宝宝最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值