知道一棵二叉树的前序和中序序列求二叉树的后续序列

Posted ly_rabbit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知道一棵二叉树的前序和中序序列求二叉树的后续序列相关的知识,希望对你有一定的参考价值。

解析:由二叉树的前序和中序序列,先构建出二叉树,然后再进行后续递归遍历

注意递归停止的条件和相关的用法

源代码如下:

#include<iostream>
using namespace std;

//定义一个二叉树的数据结构
typedef struct BiNode
{
    char data;
    struct BiNode *lchild;
    struct BiNode *rchild;

}BiNode,*BiTree;

//后续递归遍历二叉树
void laterOrder(BiTree & t)
{
    if(t!=NULL)
    {
        
        laterOrder(t->lchild);    
        laterOrder(t->rchild);
        cout<<t->data;
        
    }
}

//递归构建二叉树
void createBitree(BiTree &t,string presequence,string insequence)
{
    //中序为空时 ,二叉树也为空 
    //右边中序和右边前序序列长度相同
    if(insequence.length()==0) 
    {
        t=NULL;
        return;
    }
    //每一次的根节点都由前序序列的第一个节点决定
    char rootNode=presequence[0];
    int index=insequence.find(rootNode);
    //左子书中序
    string lchild_insequence=insequence.substr(0,index);
    //右子树中序
    string rchild_insequence=insequence.substr(index+1);
    int lchile_length=lchild_insequence.length();
    int rchild_length=rchild_insequence.length();
    //左指数前序
    string lchild_presequence=presequence.substr(1,lchile_length);
    //右指数前序
    string rchild_presequece=presequence.substr(1+lchile_length);
    //构建当前遍历的当前子树根节点
    t=(BiTree)malloc(sizeof(BiNode));
    if(t!=NULL)
    {
        t->data=rootNode;
        createBitree(t->lchild,lchild_presequence,lchild_insequence);
        createBitree(t->rchild,rchild_presequece,rchild_insequence);
    }
}



void main()
{
    BiTree t=NULL;
    string presequence="ABCDEFG";
    string insequence="CBEDAFG";
    createBitree(t,presequence,insequence);
    //后续遍历
    laterOrder(t);
    printf("\n");
}

 

以上是关于知道一棵二叉树的前序和中序序列求二叉树的后续序列的主要内容,如果未能解决你的问题,请参考以下文章

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列

pascal给出一棵二叉树的中序与后序排列。求出它的先序排列(帮忙解释一下程序)

已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧

[codevs1029]遍历问题

洛谷 P1229遍历问题

递归与递推遍历问题