数据结构作业——order(二叉树遍历)
order
Description
给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后 序遍历。
Input
输入第一行为一个正整数 n 表示二叉树的节点数目, 节点编号从 1 到 n,其中 1 为根节点。
第 2 行有 n 个数字, 第 i 个数字表示 i 的父亲节点。( 1 的父亲节点为 0, 表示无)
第 3 行为中序遍历。
30%的数据: n<=20;
60%的数据: n<=1000;
100%的数据: n<=10000;
Output
输出 2 行, 第一行为先序遍历,第二行为后序遍历。
Sample Input
10
0 7 2 2 9 1 8 1 6 8
9 5 6 1 10 8 7 3 2 4
Sample Output
1 6 9 5 8 10 7 2 3 4
5 9 6 10 3 4 2 7 8 1
思路
存下每个节点的左右儿子,然后根据中序遍历判断谁是左儿子,谁是右儿子,建完树,跑一下先序遍历和后序遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 10005; int lson[maxn],rson[maxn],pos[maxn]; bool first = true ; void PreOrder( int x) { if (x != 1) printf ( " " ); printf ( "%d" ,x); if (lson[x]) PreOrder(lson[x]); if (rson[x]) PreOrder(rson[x]); } void PostOrder( int x) { if (lson[x]) PostOrder(lson[x]); if (rson[x]) PostOrder(rson[x]); first? printf ( "%d" ,x): printf ( " %d" ,x); first = false ; } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int N,i,tmp; memset (lson,0, sizeof (lson)); memset (rson,0, sizeof (rson)); memset (pos,0, sizeof (pos)); scanf ( "%d" ,&N); for (i = 1;i <= N;i++) { scanf ( "%d" ,&tmp); if (tmp == 0) continue ; if (!lson[tmp]) lson[tmp] = i; else rson[tmp] = i; } for (i = 1;i <= N;i++) { scanf ( "%d" ,&tmp); pos[tmp] = i; } for (i = 1;i <= N;i++) { if (lson[i] && rson[i]) { if (pos[rson[i]] < pos[lson[i]]) { swap(rson[i],lson[i]); } } else if (!lson[i] && rson[i]) { if (pos[rson[i]] < pos[i]) { lson[i] = rson[i]; rson[i] = 0; } } else if (lson[i] && !rson[i]) { if (pos[lson[i]] > pos[i]) { rson[i] = lson[i]; lson[i] = 0; } } } PreOrder(1); printf ( "\n" ); PostOrder(1); printf ( "\n" ); return 0; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)