二叉树前序序列、中序序列、后序序列互求

两种情况:

1、已知前序序列和中序序列,求后序序列

2、已知后序序列和中序序列,求前序序列

//已知前序序列和中序序列,求后序序列
#include 

void preorder_inorder_to_postorder(char *preorder, char *inorder, int length)
{
    if(length > 0)
    {
        int rootIndex;
        for(rootIndex = 0; rootIndex < length; rootIndex ++)
        {
            if(*(inorder + rootIndex) == *preorder)//找出根结点在中序序列中的位置
            break;
        }

        //找到根结点在中序序列中的位置后,位置之前的即为左子树,之后的即为右子树
        //左子树
        preorder_inorder_to_postorder(preorder + 1, inorder, rootIndex);

        //右子树
        preorder_inorder_to_postorder(preorder + rootIndex + 1, inorder + rootIndex + 1, length - (rootIndex + 1));

        std::cout << *preorder << " ";
    }
}

int main()
{
    std::cout << "Hello World!" << std::endl;
    char *pr = "GDAFEMHZ";
    char *in = "ADEFGHMZ";

    preorder_inorder_to_postorder(pr, in, 8);

    return 0;
}

二叉树前序序列、中序序列、后序序列互求_第1张图片

 

//已知后序序列和中序序列,求前序序列
#include 

void postorder_inorder_to_preorder(char *postorder, char *inorder, int length)
{
    if(length > 0)
    {
        std::cout << *(postorder + length - 1) << " ";//先输出根结点

        int rootIndex;
        for(rootIndex = 0; rootIndex < length; rootIndex ++)
        {
            if(*(inorder + rootIndex) == *(postorder + length - 1))//找出根结点在中序序列中的位置
            break;
        }
        //找到根结点在中序序列中的位置后,位置之前的即为左子树,之后的即为右子树
        //左子树
        postorder_inorder_to_preorder(postorder, inorder, rootIndex);

        //右子树
        postorder_inorder_to_preorder(postorder + rootIndex, inorder + rootIndex + 1, length - (rootIndex + 1));

    }
}

int main()
{
    std::cout << "Hello World!" << std::endl;
    char *po = "AEFDHZMG";
    char *in = "ADEFGHMZ";

    postorder_inorder_to_preorder(po, in, 8);

    return 0;
}

二叉树前序序列、中序序列、后序序列互求_第2张图片

你可能感兴趣的:(C语言,数据结构,C++)