PAT - 天梯赛 L2-011 玩转二叉树

本文介绍了一种算法,该算法接收二叉树的中序和前序遍历序列,首先构建二叉树,然后进行镜像翻转,并输出翻转后的层序遍历序列。文章提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2

该题与 L2-006 基本一模一样 不同的就是 先将右孩子放入队列。

L2-006:http://blog.youkuaiyun.com/yf224/article/details/79152281

#include<cstdio>
#include<queue>
using namespace std;
int n;
int bef[100];//数组开大点 开始35出现段错误 
int mid[100];
struct node{
	int l;
	int r;
}tree[100];
int build(int la, int ra, int lb, int rb){//la,ra代表中序,lb,rb代表前序 
	if(la > ra)return -1;
	int root = bef[lb],p1,p2;
	p1 = la;
	while(mid[p1] != root) p1++;
	p2 = p1-la;
	tree[root].l = build(la, p1-1, lb+1, lb+p2);
	tree[root].r = build(p1+1, ra, lb+p2+1, rb);
	return root;
}
void bfs(int a){
	queue<int>p;
	p.push(a);
	int flag=0;
	while(!p.empty()){
		int f = p.front();
		p.pop();
		if(flag) printf(" ");
		printf("%d",f);
		flag=1;
		if(tree[f].r!=-1){
			p.push(tree[f].r);
		}
		if(tree[f].l!=-1){
			p.push(tree[f].l);
		}
	}
}
int main(){
	scanf("%d", &n);
	for(int i = 0; i < n; i++)scanf("%d",&mid[i]);
	for(int i = 0; i < n; i++)scanf("%d",&bef[i]);
	build(0, n-1, 0, n-1);
	bfs(bef[0]);
	return 0;
} 




### L2-011 玩转二叉树 测试用例分析与解决方案 #### 一、问题背景 L2-011 玩转二叉树涉及通过给定的输入构建一棵二叉树并完成特定操作。此问题的核心在于理解如何利用后序遍历序列重建二叉树以及实现从下往上的遍历方法。 根据已知信息,回溯算法可以用于模拟从下往上的过程[^1]。此外,在实际应用中,还需要考虑输入数据的具体形式及其约束条件[^3]。 --- #### 二、测试用例分析 ##### 输入描述 输入分为两部分: 1. **第一行**:正整数 \( N \),表示中结点的数量。 2. **第二行**:由 \( N \) 个不超过 100 的正整数组成的后序遍历序列。 例如: ``` 7 4 5 2 6 7 3 1 ``` ##### 输出目标 基于上述输入,需输出满足题目要求的结果。具体来说,可能需要计算某些路径或节点属性。 --- #### 三、解决方案设计 为了有效解决问题,以下是详细的解法说明: 1. **二叉树的定义** 使用 Python 中的类来定义二叉树节点结构: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right ``` 2. **后序遍历前序/层次遍历转换** 后序遍历的特点是根节点位于最后一位。因此可以从后向前逐步解析出左子右子的信息,并最终还原整个二叉树。 下面是一个简单的重构函数示例: ```python def build_tree(postorder, inorder_map, start, end): if start > end: return None root_val = postorder.pop() # 取最后一个作为当前根节点 root = TreeNode(root_val) index = inorder_map[root_val] # 构建右子 (注意顺序:右后左) root.right = build_tree(postorder, inorder_map, index + 1, end) root.left = build_tree(postorder, inorder_map, start, index - 1) return root def reconstruct_tree(inorder, postorder): inorder_map = {val: idx for idx, val in enumerate(inorder)} return build_tree(postorder.copy(), inorder_map, 0, len(inorder) - 1) ``` 3. **从下往上遍历** 利用递归特性,当递归触底返回时即可实现从下往上的访问逻辑。这实际上对应于后续遍历的过程。 实现如下: ```python def bottom_up_traversal(node, result=[]): if not node: return [] left_result = bottom_up_traversal(node.left, result) right_result = bottom_up_traversal(node.right, result) combined_result = left_result + right_result + [node.val] return combined_result ``` 4. **综合处理流程** 将以上模块整合起来形成完整的程序框架: ```python from collections import deque def main(): n = int(input().strip()) postorder = list(map(int, input().split())) # 假设存在对应的中序遍历(通常会提供) inorder = sorted(postorder) # 如果未指定,则假设按升序排列 tree_root = reconstruct_tree(inorder, postorder) # 执行从下往上的遍历或其他操作 final_result = bottom_up_traversal(tree_root) print(' '.join(map(str, final_result))) if __name__ == "__main__": main() ``` --- #### 四、常见错误及优化建议 1. **边界情况处理不足** 当输入为空或者只有一个节点时,应特别验证其行为是否符合预期。 2. **性能瓶颈** 对于较大的 \( N \) (接近上限 30),虽然理论上不会超时,但仍可采用更高效的哈希表存储索引来加速查找过程。 3. **调试技巧** 添加日志打印语句辅助定位潜在问题所在位置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值