Traversing BinayTree

 

二叉树 ,中序遍历序列EDCBAHFG ,后序遍历序列是DBCEFGHA,它的前序遍历的序列是?

代码实现

 

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

class BinaryTreeNode;
typedef BinaryTreeNode*    BinaryTreeNodePtr;

//template<typename T>
class BinaryTreeNode
{
public:
    BinaryTreeNode(char cChar)
        :m_cObject(cChar)
        ,m_pParent(NULL)
        ,m_pRight(NULL)
        ,m_pLeft(NULL)
    {

    }

    char                    m_cObject;
    BinaryTreeNodePtr    m_pParent;
    BinaryTreeNodePtr    m_pLeft;
    BinaryTreeNodePtr    m_pRight;
protected:
private:
};

//Note:参考
//char    g_caInorder[]    = {"EDCBAHFG"};
//char    g_caPostorder[] = {"DBCEFGHA"};

BinaryTreeNodePtr    Rebuild(BinaryTreeNodePtr    paInorder[]
                            ,BinaryTreeNodePtr    paPostorder[]
                            ,int                iLen)
{
    if (iLen<1)
        return NULL;

    if(1==iLen ){
        paPostorder[iLen-1]->m_pLeft = paPostorder[iLen-1]->m_pRight = NULL;
        return paPostorder[iLen-1];
    }
    int iLeftLen =0;
    BinaryTreeNodePtr t_pNode=  paPostorder[iLen-1];
    for (;paInorder[iLeftLen]!=t_pNode && iLeftLen<iLen;iLeftLen++);
    t_pNode->m_pLeft = Rebuild(paInorder              ,paPostorder           , iLeftLen );
    t_pNode->m_pRight =Rebuild(paInorder+1+iLeftLen ,paPostorder+iLeftLen ,iLen-iLeftLen-1 );
    return t_pNode;
   
};

void    PreorderTraverse(BinaryTreeNodePtr pNode)
{
    if (!pNode)
        return;
    std::cout<<pNode->m_cObject<<" -> ";
    PreorderTraverse(pNode->m_pLeft);
    PreorderTraverse(pNode->m_pRight);
}


int main()
{
#define g_iLen  8
                                    //   0 , 1    2      3    4   5   6    7
    BinaryTreeNode g_oaNode [g_iLen] = {'A' , 'B','C' , 'D' ,'E','F','G' , 'H'};

    BinaryTreeNodePtr g_paInorder[g_iLen];
    int                  g_iaInorder[g_iLen] = {4 , 3 , 2 ,1 , 0 ,7 , 5 , 6 };
    BinaryTreeNodePtr g_paPostorder [g_iLen];
    int                  g_iaPostorder[g_iLen] = {3 ,1 , 2,4 ,5 , 6 , 7 ,0};

    for (int i =0; i<g_iLen; i++)
    {
        g_paInorder[i]   = &g_oaNode[ g_iaInorder[i]];
        g_paPostorder[i] = &g_oaNode[ g_iaPostorder[i]];
    }

    BinaryTreeNodePtr g_pHead = Rebuild(g_paInorder ,g_paPostorder , g_iLen );

    if (g_pHead)
    {
        PreorderTraverse(g_pHead);
    }

    return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值