面试题5:重建二叉树

来源:互联网 发布:精通 d3.js pdf 编辑:程序博客网 时间:2024/06/10 14:10

思路:先根据先序序列第一个数建立根节点,然后再中序序列中找到根节点的位置,进而确定左右子树的前序序列和后序序列,递归的构建左右子树。

C++代码:

#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;struct BiTreeNode{int m_nData;BiTreeNode *m_pLeftChild;BiTreeNode *m_pRightChild;};BiTreeNode* CreateBiTreeByPreorderAndInorder(int* preOrder, int nPreStart, int nPreEnd, int* inOrder, int nInStart, int nInEnd){//出口if (nPreStart > nPreEnd){return NULL;}//根据先序序列找到根结点int 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(int *preOrder, int *inOrder, int nLength){    if ((preOrder!=NULL) && (inOrder!=NULL) && (nLength>0))    {return CreateBiTreeByPreorderAndInorder(preOrder, 0, nLength-1, inOrder, 0, nLength-1);    }else{return NULL;}}void PreOrderPrint(BiTreeNode *pRoot){if (pRoot != NULL){cout << pRoot->m_nData << " ";PreOrderPrint(pRoot->m_pLeftChild);PreOrderPrint(pRoot->m_pRightChild);}}void InOrderPrint(BiTreeNode *pRoot){if (pRoot != NULL){InOrderPrint(pRoot->m_pLeftChild);cout << pRoot->m_nData << " ";InOrderPrint(pRoot->m_pRightChild);}}int _tmain(int argc, _TCHAR* argv[]){int nPreOrderArr[8] = {1,2,4,7,3,5,6,8};int nInOrderArr[8] = {4,7,2,1,5,3,8,6};BiTreeNode *pRoot = CreateBiTreeByPreorderAndInorder(nPreOrderArr, nInOrderArr,8);cout << "先序序列:";PreOrderPrint(pRoot);cout << endl;cout << "后序序列:";InOrderPrint(pRoot);cout << endl;system("pause");return 0;}


原创粉丝点击