【蓝桥杯PythonB组备赛】【递归】1497. 树的遍历【二叉树遍历Python版】【AcWing蓝桥杯集训·每日一题】

目录

一、二叉树

1.二叉树的创建

2.二叉树的遍历(先序+中序+后序+层序)

图文理解

代码实现

二、AcWing 1497. 树的遍历(每日一题)

1.题目描述

2.思路分析

3.代码实现


一、二叉树

1.二叉树的创建

比如要创建下图所示二叉树:

# 节点类
class TreeNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
        # 左节点和右节点默认为空

    def __str__(self):
        return self.data


def createBinaryTree():
    A, B, C, D, E, F, G, H, I = [TreeNode(x) for x in 'ABCDEFGHI']
    '''
    相当于:
    A = TreeNode('A')
    B = TreeNode('B')
    ...
    '''
    A.left = B
    A.right = C
    B.right = D
    C.left = E
    C.right = F
    E.left = G
    F.left = H
    F.right = I
    return A

 

 

 

2.二叉树的遍历(先序+中序+后序+层序)

  • 图文理解

数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)_正弦定理的博客-CSDN博客_中序遍历

 推荐参考这位作者的图文讲解,感谢大佬~

  • 代码实现

from collections import deque  # 双端队列


# 节点类
class TreeNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
        # 左节点和右节点默认为空

    def __str__(self):
        return self.data


# 创建二叉树
def createBinaryTree():
    A, B, C, D, E, F, G, H, I = [TreeNode(x) for x in 'ABCDEFGHI']
    '''
    相当于:
    A = TreeNode('A')
    B = TreeNode('B')
    ...
    '''
    A.left = B
    A.right = C
    B.right = D
    C.left = E
    C.right = F
    E.left = G
    F.left = H
    F.right = I
    return A


# 先序遍历(递归)
def preOrder(node, res=[]):  # 节点
    if node:  # node is not None
        res.append(node.data)
        preOrder(node.left)
        preOrder(node.right)
    return res


# 中序遍历(递归)
def inOrder(node, res=[]):
    if node:
        inOrder(node.left)
        res.append(node.data)
        inOrder(node.right)
    return res


# 后序遍历(递归)
def postOrder(node, res=[]):
    if node:
        postOrder(node.left)
        postOrder(node.right)
        res.append(node.data)
    return res


# 先序遍历(迭代)
def preorderIter(root, res=[]):
    stack = []  # 栈:记录访问过的根节点
    node = root
    while True:
        while node:
            res.append(node.data)
            stack.append(node)
            node = node.left
        if not stack:  # 如果栈为空
            break
        node = stack.pop().right  # 访问被弹出节点的右节点
    return res


# 中序遍历(迭代)
def inOrderIter(node, res=[]):
    pass


# https://www.bilibili.com/video/BV15f4y1W7i2/?spm_id_from=333.788&vd_source=95585215c756caf0d30065463e625a78

# 后序遍历(迭代)
def postOrderIter(node, res=[]):
    pass


# 层序遍历 https://www.bilibili.com/video/BV15f4y1W7i2/?spm_id_from=333.788&vd_source=95585215c756caf0d30065463e625a78
def levelOrder(root, res=[]):
    queue = deque([root])  # (双端)队列
    while queue:
        node = queue.popleft()
        res.append(node.data)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return res


if __name__ == '__main__':
    root = createBinaryTree()  # 根节点
    print(preOrder(root))
    print(inOrder(root))
    print(postOrder(root))
    print(preorderIter(root))
    print(levelOrder(root))

二、AcWing 1497. 树的遍历(每日一题)

1.题目描述

2.思路分析

1.通过中后序列构造二叉树(递归)
2.层序遍历二叉树

 

 

3.代码实现

from collections import deque

N = int(input())
postOrder = list(map(int, input().split()))
inOrder = list(map(int, input().split()))


class TreeNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None


def buildTree(inOrder, postOrder):
    if not postOrder:  # postOrder == []
        return None
    root = TreeNode(postOrder[-1])
    rootIndexIn = inOrder.index(root.data)
    inOrder_left = inOrder[:rootIndexIn]
    inOrder_right = inOrder[rootIndexIn + 1:]
    postOrder_left = postOrder[:rootIndexIn]
    postOrder_right = postOrder[rootIndexIn:-1]
    root.left = buildTree(inOrder_left, postOrder_left)
    root.right = buildTree(inOrder_right, postOrder_right)
    return root


def levelOrder(root, res=[]):
    queue = deque([root])
    while queue:
        node = queue.popleft()
        res.append(node.data)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
    return ' '.join(map(str, res))


print(levelOrder(buildTree(inOrder, postOrder)))

如有不足或不解之处欢迎留言指正哈。

如有帮助可以点赞收藏嘛,感谢~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秃头小二

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

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

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

打赏作者

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

抵扣说明:

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

余额充值