数据结构作业——order(二叉树遍历)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业——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
思路
存下每个节点的左右儿子,然后根据中序遍历判断谁是左儿子,谁是右儿子,建完树,跑一下先序遍历和后序遍历
#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; }
以上是关于数据结构作业——order(二叉树遍历)的主要内容,如果未能解决你的问题,请参考以下文章
二叉树的层次遍历 · Binary Tree Level Order Traversal
二叉树垂直遍历 · Binary Tree Vertical Order Traversal
LeetCode: Binary Tree Level Order Traversal 层序遍历二叉树
LeetCode | 0102. Binary Tree Level Order Traversal二叉树的层次遍历Python