已知树的前序和中序遍历,求后序遍历;后序和中序,求前序

来源:互联网 发布:乐乎公寓工作怎么样 编辑:程序博客网 时间:2024/06/05 04:57

首先需要说明的是,网上不知道为什么很多误传,说给定前序、中序和后序中的两个,可以唯一确定另一个,显然这是错误的。给定前序和后序,是无法确定中序的,一个最简单的例子就是只有两个节点的树,前序和后序给定,中序无法确定。

代码如下:

/*
* Copyright (c) 2014
* All Rights Reserved.
* author: laohaizi
*/

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;

typedef struct _NODE
{
    char name;
    struct _NODE *left,*right;
}NODE;

char *preorder="abcdefg";
char *inorder="cbedagf";
//char *inorder="abcdefg";
char *postorder="cedbgfa";
const int preorder_len = strlen(preorder);
const int inorder_len = strlen(inorder);
const int postorder_len = strlen(postorder);

NODE * PostOrder(char *preorder, int prebeg, int preend, char *inorder, int inbeg, int inend)
{
    if (prebeg > preend || inbeg > inend || prebeg >= preorder_len || inbeg >= inorder_len || preend < 0 || inend < 0)
    {
        return NULL;
    }
    NODE *p = new NODE;
    p->name = preorder[prebeg];
    int k = 0;
    int cnt = 0;
    for (k = inbeg; k <= inend; ++k)
    {
        cnt ++;
        if (inorder[k] == preorder[prebeg])
        {
            break;
        }
    }
    p->left = PostOrder(preorder,prebeg+1,prebeg+cnt-1,inorder,inbeg,k-1);
    p->right = PostOrder(preorder,prebeg+cnt,preend,inorder,k+1,inend);
    return p;
}

NODE * PreOrder(char *postorder, int postbeg, int postend, char *inorder, int inbeg, int inend)
{
    if (postbeg > postend || inbeg > inend || postbeg >= postorder_len || inbeg >= inorder_len || postend < 0 || inend < 0)
    {
        return NULL;
    }
    NODE *p = new NODE;
    p->name = postorder[postend];
    int k = 0;
    int cnt = 0;
    for (k = inbeg; k <= inend; ++k)
    {
        cnt ++;
        if (inorder[k] == postorder[postend])
        {
            break;
        }
    }
    p->left = PreOrder(postorder,postbeg,postbeg+cnt-2,inorder,inbeg,k-1);
    p->right = PreOrder(postorder,postbeg+cnt-1,postend-1,inorder,k+1,inend);
    return p;
}

int NodeNum(NODE *p)
{
    if (p == NULL)
        return 0;
    return NodeNum(p->left)+NodeNum(p->right)+1;
}

void PostorderTraverse(NODE *p)
{
    if(p != NULL)
    {
        PostorderTraverse(p->left);
        PostorderTraverse(p->right);
        cout<<p->name;
    }
}

void PreorderTraverse(NODE *p)
{
    if(p != NULL)
    {
        cout<<p->name;
        PreorderTraverse(p->left);
        PreorderTraverse(p->right);
    }
}

int main()
{   
    //get postorder
    NODE *root = PostOrder(preorder,0,preorder_len-1,inorder,0,inorder_len-1);
   
    int nodenum = NodeNum(root);
    if (nodenum != preorder_len)
    {
        cout<<"post order not exist."<<endl;
        return 0;
    }

    cout<<"post order: ";
    PostorderTraverse(root);
    cout<<endl;

    //get preorder
    root = PreOrder(postorder,0,postorder_len-1,inorder,0,inorder_len-1);
   
    nodenum = NodeNum(root);
    if (nodenum != postorder_len)
    {
        cout<<"pre order not exist."<<endl;
        //return 0;
    }

    cout<<"pre order: ";
    PreorderTraverse(root);
    cout<<endl;
    return 0;
}

0 0
原创粉丝点击