数据结构作业——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 层序遍历二叉树

数据结构与算法第10周作业——二叉树的创建和遍历算法

数据结构-第10周作业(二叉树的创建和遍历算法)

LeetCode | 0102. Binary Tree Level Order Traversal二叉树的层次遍历Python