根据二叉树先序和中序遍历结果求其后序遍历

来源:互联网 发布:淘宝宝贝如何设置打折 编辑:程序博客网 时间:2024/05/15 04:16

首先我们先复习下不同类别的遍历:

先序遍历:遍历二叉树时先遍历根节点,然后遍历其左子树,最后遍历右子树。

中序遍历:先遍历其左子树,然后遍历根节点,最后遍历右子树。

后续遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。

假如给定二叉树的先序1,2,4,7,3,5,6,8,和中序4,7,2,1,5,3,8,6,求其后序遍历结果

实现思路是首先构建二叉树,然后后续遍历输出。

由上面的各种不同遍历的定义我们知道,先序遍历第一个元素为根节点,因此我们可以在中序序列中找到根节点的位置,而根据中序遍历的定义,我们知道在中序序列中根节点元素左侧的为左子树,右侧的为右子树。因此可以知道,4、7、2为左子树节点,5、3、8、6为右子树节点。同理我们可以知道先序序列中第二个元素为左子树的根,因此同样可对左子树节点进行划分,在先序序列中去除队列前左子树节点后,即从第5个元素开始即为右子树节点,且第五个即为其根节点。这样递归的去进行划分,直到左右子树为空,为其指定左右孩子,然后依次返回。


以下为实现代码

#include<stdio.h>#include<stdlib.h>typedef int Elemtype;typedef struct node{    Elemtype value;    struct node *lchild;    struct node *rchild;}tree_node,*tree_pnode;tree_pnode create_tree(Elemtype *pre_traverse,Elemtype* mid_traverse,int size){       if(size<=0)        return NULL;    int i = 0;    for(i;i<size;i++)        if(*(mid_traverse+i)==*pre_traverse)                break;    tree_pnode pnode = (tree_pnode)malloc(sizeof(tree_node));       pnode->value = mid_traverse[i];        pnode->lchild = create_tree(pre_traverse+1,mid_traverse,i);    pnode->rchild = create_tree(pre_traverse+i+1,mid_traverse+i+1,size-i-1);        return pnode;}void back_traverse(tree_pnode tree){    tree_pnode current = tree;    if(tree != NULL)    {           back_traverse(tree->lchild);         back_traverse(tree->rchild);         printf("%d ",tree->value);    }}int main(){        Elemtype pre_traverse[8] = {1,2,4,7,3,5,6,8},mid_traverse[8] = {4,7,2,1,5,3,8,6};    tree_pnode tree = create_tree(pre_traverse,mid_traverse,8);    printf("backtraverse\n");    back_traverse(tree);}

运行结果:7 4 2 5 8 6 3 1


0 0