天天看点

二叉树的后序遍历(二叉树)

1.题目:

二叉树的后序遍历(二叉树)
Problem Description

给你一个二叉树的前序遍历和中序遍历,输出这个二叉树的后序遍历。

二叉树的后序遍历(二叉树)
Input

输入数据有多组,每组占三行:

第一行为一个整数n(n<=100),表示这个二叉树的节点个数,节点数据类型为整型。

第二行有n个数,表示二叉树的前序遍历序列,各节点值之间有一空格。

第三行有n个数,表示二叉树的中序遍历,各节点值之间有一空。

二叉树的后序遍历(二叉树)
Output

对于每组数据,输出二叉树的后序遍历,元素之间用一个空格分隔,每组输出占一行。

二叉树的后序遍历(二叉树)
Sample Input

9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
      

二叉树的后序遍历(二叉树)
Sample Output

7 4 2 8 9 5 6 3 1
      

2.代码一:

#include <iostream>
using namespace std;

struct BiNode {
    int data;
    struct BiNode* left, *right;
};

int n;
void BiOrder(int* pre, int* mid, int len);

int main()
{
    int i, j, pre[101], mid[101];

    while (~scanf("%d", &n)) {

        for (i = 0; i < n; i++)
            scanf("%d ", &pre[i]);  ///从键盘上接收前序序列

        for (j = 0; j < n; j++)
            scanf("%d ", &mid[j]);  ///从键盘上接收中序序列

        BiOrder(pre, mid, n); ///调用操作,输出后序序列

        printf("\n");
    }

    return 0;
}

void BiOrder(int* pre, int* mid, int len)
{
    if (len <= 0)
        return ;    ///如果长度为非正数的,就结束
    BiNode* p = new BiNode;  ///动态生成一个节点p
    p->data = *pre; ///并将该结点指向前序序列
    int i;
    for (i = 0; i < len; i++) { ///遍历中序序列
        if (mid[i] == *pre)
            break;    ///在中序序列中找到根节点的位置
    }
    BiOrder(pre + 1, mid, i); ///递归遍历左子树
    BiOrder(pre + i + 1, mid + i + 1, len - (i + 1)); ///递归遍历右子树
    if (len < n)
        printf("%d ", p->data);
    else
        printf("%d", p->data);
}
           

 代码二:

#include <stdio.h>
#include <string.h>

struct TreeNode {
    int date;
    struct TreeNode* left;
    struct TreeNode* right;
};

int n;

void BiOrder(int* mid, int* pre, int len)
{
    if (len <= 0) //是退出这个函数的条件
        return ;
        
    TreeNode* node = new TreeNode;
    
    node->date = *pre;
    
    int i = 0;
    
    for (; i < len; i++) {
        if (mid[i] == *pre)
            break;
    }//这个就是找到中序历遍中和前序历遍第一个数相等的数
    
    BiOrder(mid, pre + 1, i);
    BiOrder(mid + i + 1, pre + i + 1, len - (i + 1));
    /*比如pre={1,2,4,5,3}   mid={4,2,5,1,3}  那么我们先找到1,然后1把mid分成两部分{4,2,5} 和{3}
       pre从2开始长度为3的就是左子树的前序历遍,mid的左半部分三个就是左子树的后续历遍,所以继续递归*/
       
    if (len < n)
        printf("%d ", node->date);
    else
        printf("%d", node->date);
    /*前n-1个数,输出的时候后边都加上一个空格,最后一个不加,就能弄成题目要求的输出格式了*/
    
    return ;
}

int main()
{
    int i, j, pre[101], mid[101];
    
    while (~scanf("%d", &n)) {
            
        for (i = 0; i < n; i++)
            scanf("%d ", &pre[i]);
    
        for (j = 0; j < n; j++)
            scanf("%d ", &mid[j]);
            
        BiOrder(mid, pre, n);
        
        printf("\n");
    }
    
    return 0;
}

           

继续阅读