面试题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;}
- 面试题5:重建二叉树
- 面试题重建二叉树
- 面试题----重建二叉树
- 面试题整理-重建二叉树
- 面试题6:重建二叉树
- 【面试题六】重建二叉树
- 《剑指Offer》面试题-重建二叉树
- 重建二叉树(面试题 6)
- 面试题6:重建二叉树
- 面试题6- 重建二叉树
- 面试题6 重建二叉树
- 面试题6:重建二叉树
- 面试题6 重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- 面试题6:重建二叉树
- Java旅程起航了!
- Mysql 体系结构系列之一
- 定时任务中shell脚本的执行
- Linux 进程间通信
- centos ssh登录后添加提示信息
- 面试题5:重建二叉树
- window + ruby + rails + netbeans + mongrel
- 读书记录
- java导入txt文件进入mysql
- iOS开发:黑苹果Mac系统快捷键修改
- 1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、412345等.要求:"4"不能在第三位,"3"与"5"不能相连.
- Software Industry Revolution----POJ3898----DP
- hdu 3074 Multiply game(模板级线段树)
- wgs84到gcj02