深入解析:二叉树、动态规划与链表学习

news/2025/12/6 10:18:11/文章来源:https://www.cnblogs.com/yangykaifa/p/19314986

文章目录

    • 二叉树前序、中序、后序遍历相互求法
      • 前序遍历:
      • 前序遍历实现(Python)
        • 递归实现
        • 迭代实现
        • 使用示例
      • 中序遍历:
      • 中序遍历实现方法
        • 后序遍历:
      • 后序遍历实现
        • 递归实现
        • 非递归实现
        • 示例用法
    • python 输出数组中最长递增子序列
      • 最长递增子序列问题
        • 动态规划实现
        • 更高效的二分查找实现
        • 代码说明
        • 复杂度对比
    • python 反转单链表
      • 反转单链表的方法
        • 迭代法
        • 递归法
        • 复杂度分析

二叉树前序、中序、后序遍历相互求法

前序遍历:

1.访问根节点
2.前序遍历左子树
3.前序遍历右子树

前序遍历实现(Python)

前序遍历是二叉树遍历的一种方式,顺序为:根节点 -> 左子树 -> 右子树。以下是递归和迭代两种实现方法。

递归实现

递归方法简洁直观,适合理解前序遍历的逻辑。

class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def preorder_traversal(root):
result = []
def traverse(node):
if not node:
return
result.append(node.val)  # 访问根节点
traverse(node.left)      # 遍历左子树
traverse(node.right)     # 遍历右子树
traverse(root)
return result
迭代实现

迭代方法使用栈模拟递归调用,避免递归的深度限制。

def preorder_traversal_iterative(root):
if not root:
return []
stack, result = [root], []
while stack:
node = stack.pop()
result.append(node.val)
if node.right:  # 右子节点先入栈(后处理)
stack.append(node.right)
if node.left:   # 左子节点后入栈(先处理)
stack.append(node.left)
return result
使用示例
# 构建二叉树
#     1
#      \
#       2
#      /
#     3
root = TreeNode(1, None, TreeNode(2, TreeNode(3), None))
print("递归结果:", preorder_traversal(root))          # 输出: [1, 2, 3]
print("迭代结果:", preorder_traversal_iterative(root)) # 输出: [1, 2, 3]

中序遍历:

1.中序遍历左子树
2.访问根节点
3.中序遍历右子树

中序遍历实现方法

中序遍历是二叉树遍历的一种方式,顺序为:左子树、根节点、右子树。以下是Python实现方法:

递归实现

class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def inorderTraversal(root):
res = []
def inorder(node):
if not node:
return
inorder(node.left)
res.append(node.val)
inorder(node.right)
inorder(root)
return res

迭代实现(使用栈)

def inorderTraversal(root):
res = []
stack = []
curr = root
while curr or stack:
while curr:
stack.append(curr)
curr = curr.left
curr = stack.pop()
res.append(curr.val)
curr = curr.right
return res

二叉树构造示例

# 构建示例二叉树
#     1
#      \
#       2
#      /
#     3
root = TreeNode(1)
root.right = TreeNode(2)
root.right.left = TreeNode(3)
print(inorderTraversal(root))  # 输出: [1, 3, 2]
后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点

后序遍历实现

后序遍历是二叉树遍历的一种方式,遍历顺序为左子树、右子树、根节点。以下是递归和非递归两种实现方法。

递归实现

递归方法是最直观的实现方式,直接按照左、右、根的顺序递归调用即可。

class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def postorder_traversal(root):
result = []
def traverse(node):
if node is None:
return
traverse(node.left)
traverse(node.right)
result.append(node.val)
traverse(root)
return result
非递归实现

非递归方法使用栈来模拟递归过程,需要注意访问节点的顺序和标记已处理节点的状态。

def postorder_traversal_iterative(root):
if not root:
return []
stack = []
result = []
last_visited = None
node = root
while stack or node:
if node:
stack.append(node)
node = node.left
else:
peek_node = stack[-1]
if peek_node.right and last_visited != peek_node.right:
node = peek_node.right
else:
result.append(peek_node.val)
last_visited = stack.pop()
return result
示例用法

以下是如何使用上述代码遍历一个简单的二叉树。

# 构建二叉树
#       1
#      / \
#     2   3
#    / \
#   4   5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print("递归后序遍历:", postorder_traversal(root))
print("非递归后序遍历:", postorder_traversal_iterative(root))

输出结果:

递归后序遍历: [4, 5, 2, 3, 1]
非递归后序遍历: [4, 5, 2, 3, 1]

python 输出数组中最长递增子序列

最长递增子序列问题

最长递增子序列(Longest Increasing Subsequence, LIS)是一个经典的动态规划问题。以下是一个Python实现,能够找到并输出数组中最长递增子序列的长度和具体序列。

动态规划实现

动态规划方法的时间复杂度为O(n²),适用于中等规模输入。

def longest_increasing_subsequence(nums):
if not nums:
return 0, []
n = len(nums)
dp = [1] * n
prev = [-1] * n
for i in range(1, n):
for j in range(i):
if nums[i] > nums[j] and dp[i] < dp[j] + 1:
dp[i] = dp[j] + 1
prev[i] = j
max_length = max(dp)
last_index = dp.index(max_length)
# 回溯构建最长子序列
lis = []
while last_index != -1:
lis.append(nums[last_index])
last_index = prev[last_index]
lis.reverse()
return max_length, lis
# 示例
nums = [10, 9, 2, 5, 3, 7, 101, 18]
length, sequence = longest_increasing_subsequence(nums)
print("Length of LIS:", length)
print("LIS sequence:", sequence)
更高效的二分查找实现

对于大规模数据,可以使用二分查找优化,时间复杂度降低到O(n log n)。

import bisect
def longest_increasing_subsequence_optimized(nums):
tails = []
prev_indices = [-1] * len(nums)
indices = []
for i, num in enumerate(nums):
idx = bisect.bisect_left(tails, num)
if idx == len(tails):
tails.append(num)
indices.append(i)
else:
tails[idx] = num
indices[idx] = i
if idx > 0:
prev_indices[i] = indices[idx - 1]
# 回溯重建序列
max_length = len(tails)
if max_length == 0:
return 0, []
lis = []
current = indices[-1]
while current != -1:
lis.append(nums[current])
current = prev_indices[current]
lis.reverse()
return max_length, lis
# 示例
nums = [10, 9, 2, 5, 3, 7, 101, 18]
length, sequence = longest_increasing_subsequence_optimized(nums)
print("Length of LIS:", length)
print("LIS sequence:", sequence)
代码说明
  1. 动态规划方法使用两个数组:dp存储以每个元素结尾的LIS长度,prev记录前驱索引以便重建序列。
  2. 优化方法维护一个tails数组,其中tails[i]表示长度为i+1的递增子序列的最小末尾元素。
  3. 两种方法都通过回溯前驱索引来重建实际的LIS序列。
复杂度对比

对于大多数实际应用,二分查找优化版本是更好的选择,特别是当输入规模较大时。


python 反转单链表

单链表的实现
用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点。
以“结点的序列”表示线性表,称作线性链表(单链表)。单链表是一种顺序存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。
链表的结点结构: 
┌──┬──┐   
│data│next│   
└──┴──┘   
data域:存放结点值的数据域   
next域:存放结点的直接后继的地址(位置)的指针域(链域)。
注意:①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。   
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
所谓的链表就好像火车车厢一样,从火车头开始,每一节车厢之后都连着后一节车厢。

反转单链表的方法

反转单链表是数据结构中的常见操作,可以通过迭代或递归的方式实现。以下是两种方法的详细说明和示例代码。

迭代法

迭代法通过遍历链表,逐个反转节点的指针方向。需要维护三个指针:prevcurrentnext_node

class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverse_list(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev

步骤解析:

  • 初始化 prevNonecurrent 为链表头节点 head
  • 遍历链表,保存 current 的下一个节点到 next_node
  • 反转 current 的指针方向,使其指向 prev
  • 更新 prevcurrent 为下一个节点。
  • 最终 prev 成为新链表的头节点。
递归法

递归法通过递归调用反转子链表,再将当前节点连接到反转后的子链表末尾。

def reverse_list_recursive(head):
if not head or not head.next:
return head
new_head = reverse_list_recursive(head.next)
head.next.next = head
head.next = None
return new_head

步骤解析:

  • 递归终止条件是当前节点为空或下一个节点为空。
  • 递归调用反转 head.next 的子链表,返回的新头节点为 new_head
  • 将当前节点 head 的下一个节点的指针指向 head,完成局部反转。
  • head.next 设置为 None,避免链表成环。
  • 最终返回 new_head 作为反转后的链表头节点。
复杂度分析
  • 时间复杂度:两种方法均为 O(n),需要遍历链表一次。
  • 空间复杂度:迭代法为 O(1),递归法为 O(n)(递归调用栈空间)。

部分题目来源网络资源!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/989861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年内蒙古十大钢结构工程设计公司推荐:钢结构工程设计公

TOP1 推荐:通辽市海漫钢构彩板有限责任公司 推荐指数:★★★★★ 口碑评分:内蒙古地区首推的钢结构工程公司 专业能力:通辽市海漫钢构彩板有限责任公司是集设计、生产加工、安装于一体的轻钢结构、彩钢制品专业化公…

2025年热门的云南泡沫包装箱/昆明泡沫包装箱厂家选购指南与推荐

2025年热门的云南泡沫包装箱/昆明泡沫包装箱厂家选购指南与推荐行业背景与市场趋势随着云南特色农产品、生鲜电商和冷链物流行业的蓬勃发展,泡沫包装箱作为重要的运输保护材料,市场需求持续增长。2024年云南省农产品…

2025年12月关键词厂家推荐:行业权威盘点与品质红榜发布

引言在 2025 年 12 月,为助力各行业精准挑选高低温试验箱厂家,我们依据国内相关行业协会测评权威数据及专业白皮书内容,精心开展了本次行业权威盘点,并发布品质红榜。此次测评方法科学严谨,依据多维度指标进行综合…

简易的提交限流实现-java

public class MessageController {// ================== 1. 限流配置区域 (纯Java实现) ==================// 最大容量 (允许瞬间并发多少个)private static final double MAX_TOKENS = 5.0;// 生成速率 (每秒允许通…

刚入职的AIops菜鸡,应该知道gang-scheduling和binpack调度吗?

如题,刚入职的AIOps菜鸡, 基于kubeflow做AI大模型训练和推理,本文记录了企业项目:[云原生AI算力平台] 在云原生的背景下,遇到了一些现实挑战和应对方式。 1. 可插拔的调度框架 k8s以可插拔的插件方式实现了调度能…

2025逆流闭式冷却塔制造商TOP5权威推荐:甄选优质工厂与

工业冷却系统作为生产核心支撑,其稳定性直接影响企业产能与成本控制。2024年数据显示,国内工业冷却设备市场规模突破360亿元,但32%的企业因选错冷却塔遭遇结垢堵塞、能耗超标等问题,其中逆流闭式冷却塔因技术门槛高…

2025资质齐全的品牌策划企业TOP5推荐:美御品牌策划实力

品牌竞争白热化的当下,企业对战略清晰+落地高效的品牌策划服务需求激增。2024年数据显示,品牌咨询市场规模突破600亿元,年增速38%,但32%的企业反馈曾遭遇方案空泛、落地脱节、无资质背书等问题——传统策划公司的纸…

2025年评价高的挂通垃圾车/勾臂垃圾车厂家推荐及选购参考榜

2025年评价高的挂通垃圾车/勾臂垃圾车厂家推荐及选购参考榜行业背景与市场趋势随着城市化进程加快和环保政策日益严格,垃圾收运处理行业迎来了快速发展期。挂通垃圾车(又称勾臂垃圾车)作为城市环卫系统中的关键设备…

json字符数

在PostgreSQL 12中,JSON字符串的字节数计算有特殊规则,与纯文本计算有所不同。以下是详细说明: 1. PostgreSQL中的JSON存储特性 文本存储 vs JSONB存储 -- 创建测试表 CREATE TABLE json_test (id SERIAL PRIMARY K…

CMCC RAX3000Me 23.10 升级 24.10 救砖

CMCC RAX3000Me XW 版 和 RAX3000M 稍有区别:https://openwrt.org/toh/cmcc/rax3000m 硬件配置为:512M DDR3 128M SPI NAND FLASH,带 USB 3 接口。 原来是23.10 cmcc_rax3000m-nand-ubootmod-squashfs-sysupgrade.b…

2025年比较好的汽车散装设备/散装设备行业内口碑厂家排行榜

2025年汽车散装设备行业口碑厂家排行榜:专业推荐与采购指南行业背景与市场趋势随着全球基建需求的持续增长和水泥产业的快速发展,汽车散装设备作为水泥、粉煤灰等粉状物料运输的关键设备,市场需求呈现稳定上升趋势。…

2025年比较好的MF库均化设备/IBAU库均化设备TOP品牌厂家排行榜

2025年MF库均化设备/IBAU库均化设备TOP品牌厂家排行榜行业背景与市场趋势随着全球水泥工业的持续发展和技术进步,MF库均化设备和IBAU库均化设备作为水泥生产过程中的关键设备,其市场需求呈现稳定增长态势。2025年,随…

关键词:

引言高低温试验箱在电子、半导体、汽车等众多科技产业的产品研发、质量检测等环节起着至关重要的作用。为了能给广大用户提供更具参考价值的高低温试验箱厂家推荐,我们依据国内权威行业协会的测评方法和数据进行综合评…

2025年质量好的球化回火炉/密封箱式回火炉TOP实力厂家推荐榜

2025年质量好的球化回火炉/密封箱式回火炉TOP实力厂家推荐榜行业背景与市场趋势随着制造业向高质量发展转型,热处理设备作为提升金属材料性能的关键装备,市场需求持续增长。球化回火炉和密封箱式回火炉作为热处理工艺…

2025年比较好的ODM/OEM衣帽间收纳最新用户好评榜

2025年ODM/OEM衣帽间收纳用户好评榜:专业推荐与采购指南行业背景与市场趋势随着现代家居生活品质的不断提升,衣帽间收纳系统已成为家庭空间规划的重要组成部分。2025年,全球衣帽间收纳市场规模预计将达到320亿美元,…

深圳继承纠纷律师哪家强?2025年最新避坑指南及5位高口碑律师专业推荐!

在家庭财富积累与代际传承意识日益增强的当下,深圳作为高净值人群聚集的一线城市,继承纠纷案件呈现出数量增长、标的额巨大、法律关系复杂的显著趋势。许多家庭在面对亲人离世后的遗产分割时,往往陷入情感纠葛与法律…

2025年口碑好的高纤维狗粮高端品质推荐榜

2025年口碑好的高纤维狗粮高端品质推荐榜行业背景与市场趋势随着宠物经济的持续升温,2025年中国宠物食品市场规模预计突破2000亿元,其中高端狗粮市场占比逐年攀升。在这一趋势下,高纤维狗粮因其独特的健康价值受到越…

2025年质量好的挂架厨房收纳专业推荐榜单

2025年质量好的挂架厨房收纳专业推荐榜单行业背景与市场趋势随着现代家庭对厨房空间利用效率要求的不断提高,挂架厨房收纳系统已成为家居市场的重要组成部分。2024年全球厨房收纳市场规模已达780亿美元,预计到2025年…

中国宝宝肌肤护理产品怎么选?2025年最新市场分析与专业品牌推荐

在“科学育儿”与“成分党”风潮席卷的当下,中国新生代父母对婴童洗护产品的选择标准已发生根本性转变。从盲目信赖海外大牌,到理性审视成分表、追溯研发背景、验证本土适配性,父母们的决策焦虑日益具体:哪些成分真…

2025年哈尔滨诚信的汽车贴膜专业公司推荐:看哪家技术可靠?

本榜单依托哈尔滨本地汽车后市场调研与真实车主口碑,深度筛选出五家标杆汽车贴膜服务机构,为车主选型提供客观依据,助力精准匹配适配的贴膜服务伙伴。 TOP1 推荐:哈尔滨市南岗区中威车饰旗舰店 推荐指数:★★★★…