颠倒栈 {1,2,3,4,5}-->{5,4,3,2,1}

颠倒栈元素顺序
博客提及要将栈 {1,2,3,4,5} 颠倒为 {5,4,3,2,1},主要围绕栈元素顺序颠倒这一信息技术问题展开。

题目:

颠倒栈 {1,2,3,4,5}-->{5,4,3,2,1}

#include <stm32f4xx.h> static const int smg_value[]={0x800,0xF08,0x420,0x600,0x308,0x210,0x010,0xF00,0x000,0x200}; volatile int direction = 1; volatile int current_shuzi = 0; volatile int zhouqi_shijian = 1; void SmgInit (void)//数码管配置 { RCC->AHB1ENR |=1<<2; GPIOC->MODER = (GPIOC->MODER &~(0x00FF0FF0))|(0x00550540); GPIOC->OTYPER |=0xF38; GPIOC->OSPEEDR &=~0xFF0FC0; GPIOC->PUPDR &=~0xFF0FC0; GPIOC->ODR |=0xF38; } void BtnInit (void)//按钮配置 { RCC->AHB1ENR |=1<<2; GPIOC->MODER &=~(0x3<<26); GPIOC->PUPDR = (GPIOC->PUPDR &~(0x3<<26))|(0x1<<26); } void SmgFlash (int i)//循环显示1~9 { if (i>=0 && i<=9) { GPIOC->ODR = (GPIOC->ODR &~(0xF38))|smg_value[i]; } } void ExitInit (void)//配置PC11输入 { RCC->AHB1ENR |=1<<2; RCC->APB2ENR |=1<<14; SYSCFG->EXTICR[3]=(SYSCFG->EXTICR[3] &~(0xF<<4))|(0x2<<4); EXTI->IMR |=1<<13; EXTI->FTSR |=1<<13; NVIC->ISER[1] |=1<<8; } void EXTI15_10_IRQHandler(void) { if (EXTI->PR & (1<<13)) direction=-direction;//按钮按下发生中断后进行反向 EXTI->PR |=1<<13; } void TimerInit (void)//配置定时器 { RCC->APB1ENR |=1<<0; TIM2->ARR=15999; TIM2->PSC=999; TIM2->CR1=1<<7; TIM2->CR1|=1<<0; TIM2->DIER |=1<<0; NVIC->ISER[0] |=1<<28; } void Timerzhouqibh (void)//周期变化 { TIM2->ARR=(16000*zhouqi_shijian)-1; TIM2->EGR |=1<<0;//再次初始化周期 } void TIM2_IRQHandler (void) { if ( TIM2->SR & 1<<0) { TIM2->SR &=~(1<<0); if (direction==1) { if (current_shuzi<9) { current_shuzi++; } else { direction=-1; } } else { if (current_shuzi>0) { current_shuzi--; } else { direction=1; } } } } void UsartInit (void)//配置USART2并使能USART2中断 { RCC->AHB1ENR |=1<<0; RCC->APB1ENR |=1<<17; GPIOA->MODER = (GPIOA->MODER &~(0xF<<4))|(0xA<<4); GPIOA->OTYPER &=~(0xF<<4); GPIOA->OSPEEDR = (GPIOA->OSPEEDR &~(0xF<<4))|(0xA<<4); GPIOA->AFR[0] = (GPIOA->AFR[0] &~(0xFF<<8))|(0x77<<8); USART2->BRR = 1667; USART2->CR1 = (1<<13)|(1<<3)|(1<<2); USART2->CR1 |=1<<5;; NVIC->ISER[1]|=1<<6; } void USART2_IRQHandler(char c) { if (USART2->SR & (1<<5))//如果现在可以读取数据 { USART2->DR=c;//将数据寄存器中的数据赋给c if (c>=&#39;1&#39; && c<=&#39;5&#39;)//注意这里15要加&#39;&#39;,因为在我们要的是&#39;1&#39;这个字符,而不是1这个数字 { zhouqi_shijian = c-&#39;0&#39;; Timerzhouqibh(); } } } int main() { SmgInit(); BtnInit(); ExitInit(); TimerInit(); UsartInit(); while(1) { SmgFlash(current_shuzi); } } 目前这段代码我遇到的问题是串口通信时我输入了数字2但是他就卡在目前数码管显示的那个数字不动了而不是周期变为两秒。
最新发布
11-22
<think>嗯,用户问的是L2-006树的遍历问题中的测试点45的情况或解决方案。我需要先回忆一下这道题的要求。题目应该是给定一棵二叉树的后序遍历和中序遍历,要求输出层序遍历的结果。常见的错误可能出现在递归边界处理、数组索引分割不正确,或者处理大规模数据时的效率问题。 首先,测试点45通常是隐藏的测试用例,可能涉及特殊情况。比如,当树退化成链表(完全左斜或右斜),或者节点数非常大时,普通的递归方法可能会导致溢出。例如,如果测试点4是最大节点数的情况,递归深度可能超过Python的默认递归限制,导致运行错误。这时候需要改用非递归的方法,比如用模拟或者迭代的方式建树。 另外,中序和后序的分割点必须准确。比如,后序遍历的最后一个元素是根节点,在中序中找到根的位置后,分割左右子树。如果分割错误,比如索引计算有误,可能导致建树错误,进而层序遍历结果不正确。例如,当左子树的节点数为k,那么后序中前k个元素是左子树,接着是右子树,最后是根。如果这里的k计算错误,整个树结构就会错乱。 还有一种可能是当树为空的情况,或者只有一个节点时,处理不当导致数组越界。比如,当中序和后序数组长度为0时,是否返回空,或者在分割时是否正确处理左子树或右子树为空的情况。 另外,层序遍历需要用到队列,如果实现时队列的入队顺序有误,比如左右子树的顺序颠倒,或者没有正确处理空节点,也可能导致测试点失败。例如,在层序遍历时,应该先处理左子节点再处理右子节点,如果顺序反了,结果就会错误。 可能的解决方案包括检查递归的终止条件是否正确,特别是在处理子树时的索引范围是否正确。另外,对于大规模数据,改用非递归方法,或者调整递归深度限制。例如,在Python中可以通过sys.setrecursionlimit()来增加递归深度,但这种方法可能不稳定,更好的方法是使用迭代方式建树。 还有可能在处理中序和后序的索引时,是否考虑了中序中根节点的位置,正确计算左子树和右子树的大小。例如,中序的根节点位置为index,那么左子树的大小是index - in_start,右子树的大小是in_end - index。在后序中,左子树的结束位置应该是post_start + (index - in_start - 1),右子树的起始位置则是post_start + (index - in_start)。 另外,测试点可能涉及到某些特殊输入,比如所有节点都只有右子树或左子树,这时候需要确保代码能够正确处理这种极端情况,不会出现数组越界或者无限递归的情况。 可能用户遇到的测试点45的问题,就是上述中的某一种情况,比如递归溢出或者索引计算错误。需要检查代码在这些方面的实现是否正确,或者改用更稳健的建树方法。</think>### L2-006 树的遍历 测试点45分析 #### 关键问题定位 1. **递归建树导致溢出** - 当树退化成链状结构时(例如完全左斜或右斜),递归深度可能达到$10^4$级别,超出Python默认递归深度限制(约1000层),导致测试点4/5报错。此时需改用**非递归建树方式**或调整递归深度限制[^1]。 2. **索引分割错误** 中序与后序分割时需满足: $$左子树节点数 = 中序根索引 - 中序左边界$$ $$右子树节点数 = 中序右边界 - 中序根索引$$ 错误示例: ```python # 错误的后序索引分割 root.left = build(in_left, index-1, post_left, post_left + index - in_left) # 应减1 ``` 3. **特殊树型处理** - 单节点树(测试点可能含空树) - 完全左/右斜树(测试点4常见) #### 修正方案 ```python import sys from collections import deque sys.setrecursionlimit(100000) # 解除递归深度限制 def build_tree(inorder, postorder): if not postorder: return None root_val = postorder[-1] root = TreeNode(root_val) idx = inorder.index(root_val) root.left = build_tree(inorder[:idx], postorder[:idx]) root.right = build_tree(inorder[idx+1:], postorder[idx:-1]) # 修正右子树分割 return root ``` #### 测试用例验证 | 测试类型 | 输入样例 | 预期输出 | 常见错误 | |---------|---------|---------|---------| | 右斜树 | 中序:1 2 3 4<br>后序:1 2 3 4 | 4 3 2 1 | 索引计算偏移 | | 大规模数据 | 10000节点右斜树 | 10000层单节点 | 溢出 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值