根据先序,中序重建一棵二叉树;
思路:中序确定根节点,递归到叶子,在回溯建树
代码:
#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;
}