码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树前序中序遍历求后序遍历

时间:2017-03-19 11:48:37      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:order   play   gb2312   接下来   display   string   get   href   lan   

 

  已知先序和中序遍历序列,求后序遍历序列。

  已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,中序遍历序列为:D-B-G-E-A-C-F。

  接下来我们就可以求出该二叉树的后序遍历序列,具体步骤如下:

  第一步:先求root根节点,根据先序遍历规则我们可知root为先序遍历序列的第一个节点,因此该二叉树的root节点为A。

  第二步:求root的左子树和右子树,这点我们可以从中序遍历序列中找出,位于root节点A左侧的D-B-G-E为root的左子树,位于A右侧的C-F为右子树。

  第三步:求root的左孩子leftchild和右孩子rightchild,leftchild为左子树的根节点,rightchild为右子树的根节点。我们可以找到左子树D-B-E-G在先序遍历序列中的排列顺序为B-D-E-G,由于先序遍历首先访问根节点,所以B为左子树的根节点,即B为root的leftchild;同理root的rightchild为C。

  第四步:我们可以根据上面的步骤找到B的左子树和右子树,以及C的左子树和右子树,然后分别求出左右子树的根节点。以此类推,只要求出根节点及其leftchild和rightchild,剩下的过程都是递归的,最后我们就可以还原整个二叉树。

文字转自邵鸿鑫二叉树系列

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100;
struct Node {
    int value;
    Node *left_child;
    Node *right_child;
    Node () {
        left_child = right_child = NULL;
    }
};
bool first = true;
void Pos_order(Node *tree) {
    if(tree->left_child != NULL) {
        Pos_order(tree->left_child);
    }
    if(tree->right_child != NULL) {
        Pos_order(tree->right_child);
    }
    if(first) {
        cout << tree->value;
        first = false;
    } else cout << " " << tree->value;
}

Node* build(int pre[], int in[], int n) {
    if(n == 0) return NULL;
    Node *tmp = new Node;
    for(int i = 0; i < n; i++) {
        if(in[i] == pre[0]) {
            tmp->value = pre[0];
            tmp->left_child = build(pre+1, in, i);
            tmp->right_child = build(pre+i+1, in+i+1, n-i-1);
            return tmp;
        }
    }
    return NULL;
}

int main() {
    int n, pre[MAXN], in[MAXN];
    scanf("%d", &n);
    first = false;
    for(int i = 0; i < n; i++) scanf("%d", &in[i]);
    for(int i = 0; i < n; i++) scanf("%d", &pre[i]);
    Node *tree = build(pre, in, n);
    Pos_order(tree);
    return 0;
}

 

二叉树前序中序遍历求后序遍历

标签:order   play   gb2312   接下来   display   string   get   href   lan   

原文地址:http://www.cnblogs.com/cshg/p/6579596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!