树的基本概念
存储方式
二叉树
代码复现创建二叉树
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 闻不多