重建一棵二叉树

根据先序,中序重建一棵二叉树;

思路:中序确定根节点,递归到叶子,在回溯建树

代码:

#include <iostream>
#include <assert.h>
using namespace std;
typedef char Datatype;
struct BiTreeNode
{
    Datatype m_nData;
    BiTreeNode *m_pLeftChild;
    BiTreeNode *m_pRightChild;
};
BiTreeNode* CreateBiTreeByPreorderAndInorder(Datatype* preOrder,  int nPreStart,int nPreEnd
                                             ,Datatype* inOrder, int nInStart, int nInEnd)
{
    if (nPreStart > nPreEnd)
    {
        return NULL;
    }
    //根据序序列找到根结点
    Datatype nRootDate = preOrder[nPreStart];
    //在中序序列中找到根结点
    int nCount = 0;
    int nCur = 0;
    for (nCur=nInStart; nCur<=nInEnd; nCur++)
    {
        if (nRootDate != inOrder[nCur])
        {
            nCount++;//nCount记录左子树的结点个数
        }
        else
        {
            break;
        }
    }
    //创建结点
     assert(nCur >= nInStart && nCur <= nInEnd);
    BiTreeNode* pRoot = new BiTreeNode;
    pRoot->m_nData = nRootDate;

    //根据中序序列,划分两个序列,递归处理。
    pRoot->m_pLeftChild = CreateBiTreeByPreorderAndInorder(preOrder,nPreStart+1,nPreStart+nCount
                                                           ,inOrder,nInStart,nInStart+nCount-1);
    pRoot->m_pRightChild = CreateBiTreeByPreorderAndInorder(preOrder, nPreStart+nCount+1, nPreEnd
                                                          ,inOrder, nInStart+nCount+1,nInEnd);


    return pRoot;
}

//根据二叉树的中序遍历序列和后序遍历序列重建二叉树
BiTreeNode * CreateBiTreeByPreorderAndInorder(Datatype *preOrder, Datatype *inOrder, int nLength)
{
    //for(int i=0;i<nLength;i++) cout<<preOrder[i]<<" ";
    if ((preOrder!=NULL) && (inOrder!=NULL) && (nLength>0))
    {
        return CreateBiTreeByPreorderAndInorder(preOrder,  0,nLength-2,inOrder, 0, nLength-2);
    }
    else
    {
        return NULL;
    }
}

void PosOrderPrint(BiTreeNode *pRoot)
{
    if (pRoot != NULL)
    {
        PosOrderPrint(pRoot->m_pLeftChild);
        PosOrderPrint(pRoot->m_pRightChild);
        cout << pRoot->m_nData << " ";
    }
}

void InOrderPrint(BiTreeNode *pRoot)
{
    if (pRoot != NULL)
    {
        InOrderPrint(pRoot->m_pLeftChild);
        cout << pRoot->m_nData << " ";
        InOrderPrint(pRoot->m_pRightChild);
    }
}
void PreOrderPrint(BiTreeNode *pRoot)
{
    if (pRoot != NULL)
    {
        cout << pRoot->m_nData << " ";
        PreOrderPrint(pRoot->m_pLeftChild);

        PreOrderPrint(pRoot->m_pRightChild);
    }
}
int main()
{
    Datatype nInOrderArr[10] = {'C','B','E','D','A','F','I','G','H'};
    Datatype nPreOrderArr[10] = {'A','B','C','D','E','G','F','I','H'};
    BiTreeNode *pRoot = CreateBiTreeByPreorderAndInorder(nPreOrderArr, nInOrderArr,10);
     cout << "前序序列:";
    PreOrderPrint(pRoot);
    cout<<endl;
    cout << "中序序列:";
    InOrderPrint(pRoot);
    cout << endl;
    cout << "后序序列:";
    PosOrderPrint(pRoot);
    cout << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/84943572