树的遍历【2024蓝桥杯0基础】-学习笔记

树的基本概念

在这里插入图片描述
在这里插入图片描述

存储方式

在这里插入图片描述
在这里插入图片描述

二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码复现创建二叉树

class TreeNode:
    def __init__(self,value):
        self.val = value
        self.left = None
        self.right = None
def createBinaryTree(nums):
    if not nums:
        return None
    #创建下标为index的TreeNode
    def helper(index):
        if index >=len(nums) or nums[index] is None:
            return None
        node = TreeNode(nums[index])
        node.left = helper(2*index)
        node.right = helper(2* index + 1)
        return node

    #从1开始,自上往下
    root = helper(1)
    return root
x = [None] + ['A', 'B', 'C',None]
tree = createBinaryTree(x)
print(tree.val)

例题分析

在这里插入图片描述

代码复现

在这里插入图片描述

树的各种遍历复现

#先序遍历二叉树:先访问根节点,然后访问左子树,再访问右子树
def preorderTraversal(root):
    if root is None:
        return []
    result = []
    def traverse(node):
        if node is None:
            return
        result.append(node.val)
        traverse(node.left)
        traverse(node.right)
    traverse(root)
    return result
#中序遍历:先访问左子树然后根节点,然后右子树
def inorderTraversal(root):
    if root is None:
        return []
    result = []
    def traverse(node):
        if node is None:
            return
        traverse(node.left)
        result.append(node.val)
        traverse(node.right)
    traverse(root)
    return result
#后续遍历,先左子树右子树,最后根节点
def postorderTraversal(root):
    if root is None:
        return []
    result = []
    def traverse(node):
        if node is None:
            return
        traverse(node.left)
        traverse(node.right)
        result.append(node.val)
    traverse(root)
    return result
#层次遍历
from collections import deque
def levelOrderTraversal(root):
    if root is None:
        return []
    result = [] #存储遍历的结果
    queue = deque()#使用双向队列作为辅助队列
    queue.append(root) #将根节点入队
    while queue:
        node = queue.popleft()
        result.append(node.val) #访问当前节点
        if node.left is not None:
            queue.append(node.left)#将左节点入队
        if node.right is not None:
            queue.append(node.right)#将右节点入队
    return result

例题分析

在这里插入图片描述

状态分析

(1)DfS从根节点出发遍历到叶子节点就得到所有字符串
(2)利用set对得到的所有字符串去重
(3)题目意思就是每次都深搜到叶子节点只要过程不同就是两串不一样的水果串

代码复现
import sys
sys.setrecursionlimit(100000)#这里设置最大迭代次数
input = sys.stdin.readline
def dfs(u, fa):
    path.append(s[u])
    #flag表示是否为叶子节点
    flag = True
    #对于每个儿子均遍历一遍
    for v in Tree[u]:
        if v == fa: continue
        dfs(v,u)
        flag = False
    if flag:
        S.add(''.join(path))#将到叶子节点的路径记录下来
    path.pop()

while True:
    try:
        n = int(input())
        s = ' '+input()
        Tree = [[] for i in range(n + 1)]
        #邻接表存图,双向边都存,因为没有确定根节点
        for _ in range(n - 1):
            u, v = map(int, input().split())
            Tree[u].append(v)
            Tree[v].append(u)
        path = []
        S = set()#set对得到的所有字符串去重
        dfs(1, 0)
        print(len(S))#表示有多少种不同的路径
    except:
        break

感悟

这里学习的时候结合图去理解会比较好,加油!继续冲!

蓝桥杯云课学习笔记分享,欢迎大佬们批评指正!

一直在进步就好咯!

by 闻不多

  • 35
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值