本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针”。
《编程之美》3.9重建二叉树 : 已知前序和中序,重建二叉树
#include <iostream> using namespace std; #define TREELEN 6 struct NODE{ NODE* pLeft; NODE* pRight; char chValue; }; void ReBuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot){ if(nTreeLen<1){ return; } *pRoot=new NODE; (*pRoot)->pLeft=NULL; (*pRoot)->pRight=NULL; (*pRoot)->chValue=*pPreOrder; int lNum=0; //左子树节点个数 int rNum=0; //有子树节点个数 for(int i=0;i<nTreeLen;i++){ if(*pPreOrder==*(pInOrder+i)){ lNum=i; break; } } rNum=nTreeLen-1-lNum; if(lNum>=1){ ReBuild(pPreOrder+1, pInOrder, lNum, &((*pRoot)->pLeft)); } if(rNum>=1){ ReBuild(pPreOrder+1+lNum, pInOrder+1+lNum, rNum, &((*pRoot)->pRight)); } } void printTree(NODE* pRoot){ if(pRoot==NULL) return; cout<<pRoot->chValue<<", "; if(pRoot->pLeft!=NULL){ cout<<"l="<<pRoot->pLeft->chValue<<", "; }else{ cout<<"l=NULL, "; } if(pRoot->pRight!=NULL){ cout<<"r="<<pRoot->pRight->chValue<<endl; }else{ cout<<"r=NULL"<<endl; } printTree(pRoot->pLeft); printTree(pRoot->pRight); } int main(){ char szPreOrder[TREELEN]={'a','b','d','c','e','f'}; char szInOrder[TREELEN]={'d','b','a','e','c','f'}; NODE* pRoot=NULL; ReBuild(szPreOrder, szInOrder, TREELEN, &pRoot); printTree(pRoot); }