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

二叉树遍历

时间:2016-06-26 23:57:04      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 27;
char Pre[MAXN];
char In[MAXN];
void Make_root(char* Pre, char *In, int lgt){
    int i, j;
    if(lgt<=0)
        return;
    char root=Pre[0];
    char left[MAXN], right[MAXN];
    char In_left[MAXN], In_right[MAXN];
    //中根遍历根前面的都是属于左子树
    for(i=0;In[i]!=root;i++)
        In_left[i]=In[i];
    //先根遍历,根后左子树的个数是左子树
    for(j=1;j<=i;j++)
        left[j-1]=Pre[j];
    Make_root(left,In_left,i);
    i++;
    //中根遍历,根后面的都是右子树
    for(j=0;j+i<lgt;j++)
        In_right[j]=In[j+i];
    //先根遍历,根后面的都是右子树
    for(j=0;j+i<lgt;j++)
        right[j]=Pre[j+i];
    Make_root(right,In_right,lgt-i);
    printf("%c",root);
}
int main(){
    while(~scanf("%s%s",Pre,In)){
        int lgt=strlen(Pre);
        Make_root(Pre,In,lgt);
        puts("");
    }
}

思路:

采取递归的思路去做,不要求建树就可以直接找规律进行后序遍历,

先序遍历: 根+左子树的先序遍历+右子树的先序遍历

中序遍历: 左子树的中序遍历+根+右子树的中序遍历

所以递归思路是,从先序序列中读取根,从中序遍历中找出左子树的数量,再回先序遍历中找到左子树的先序遍历

这样就可以找出左子树的先序遍历和中序遍历数组,进行递归,

递归左子树和右子树,最后输出根节点,即使后序遍历。

 

二叉树遍历

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/5618899.html

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