3_9_重建二叉树

来源:互联网 发布:java开源商城系统 编辑:程序博客网 时间:2024/06/07 16:52
   1:  // 3_9重建二叉树.cpp : 定义控制台应用程序的入口点。
   2:  //
   3:   
   4:  #include "stdafx.h"
   5:   
   6:  #include
   7:  #define TREELEN 6
   8:   
   9:  using namespace std;
  13:  struct Node
  14:  {
  15:      Node *pLeft;
  16:      Node *pRight;
  17:      char chValue; 
  18:  };
  19:   
  20:  void ReBuild(char *pPreOrder,
  21:               char *pInOrder,
  22:               int nTreeLen,
  23:               Node **pRoot) //pRoot是一个指向指针的指针 
  24:  {
  25:      if(pPreOrder == NULL || pInOrder == NULL) 
  26:      {    
  27:          return;
  28:      }
  29:   
  30:      //获得前序遍历的第一个节点    
  31:      Node *pTemp = new Node;
  32:      pTemp->chValue = *pPreOrder;   
  33:      pTemp->pLeft = NULL;
  34:      pTemp->pRight = NULL;
  35:   
  36:      //如果根节点为空,把当前节点复制到根节点
  37:      if(*pRoot == NULL) //如果pRoot指向的根节点指针为NULL 
  38:      {
  39:          *pRoot = pTemp; 
  40:      }
  41:   
  42:      //如果当前树长度为1,那么已经是最后一个结点 
  43:      if(nTreeLen == 1)
  44:      {
  45:          return;
  46:      } 
  47:   
  48:      //寻找子树长度
  49:      char* pOrgInOrder = pInOrder;
  50:      char* pLeftEnd = pInOrder;
  51:      int nTempLen = 0;
  52:   
  53:      while(*pPreOrder != *pLeftEnd)
  54:      {
  55:          if(pPreOrder == NULL || pLeftEnd == NULL)
  56:          {
  57:              return;
  58:          }
  59:          nTempLen++;
  60:   
  61:          if(nTempLen > nTreeLen)
  62:          {
  63:              break;
  64:          }
  65:   
  66:          pLeftEnd++;
  67:      }
  68:   
  69:      int nLeftLen = 0;
  70:      nLeftLen = (int)(pLeftEnd - pOrgInOrder);
  71:   
  72:      int nRightLen = 0; 
  73:      nRightLen = nTreeLen - nLeftLen -1;
  74:   
  75:      if(nLeftLen > 0)
  76:      {
  77:          ReBuild(pPreOrder+1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
  78:      }
  79:   
  80:      if(nRightLen > 0)
  81:      {
  82:          ReBuild(pPreOrder + nLeftLen + 1, pInOrder + nLeftLen + 1, nRightLen, &((*pRoot)->pRight));
  83:      }
  84:   
  85:      return;    
  86:  }
  87:   
  90:  void printInOrder(Node *current)//第一个*解析成Node指针,第二个*把Node指针解析成Node对象 
  91:  {
  92:      if(current != NULL)
  93:      {
  94:          //printInOrder(   &( (*current)->pLeft )   ); //注意这里的 &( (*current)->pLeft ) 
  95:   
  96:          printInOrder(current->pLeft);
  97:          cout<chValue<<" ";
  98:          printInOrder(current->pRight);
  99:          return;
 100:      }
 101:  }
 102:   
 103:  void printPreOrder(Node *current)
 104:  {
 105:   
 106:      if(current!=NULL)
 107:      {
 108:          cout<chValue<<" ";
 109:          printPreOrder(current->pLeft);
 110:          printPreOrder(current->pRight);
 111:          return ;
 112:      }
 113:  }
 114:   
 115:  void printPostOrder(Node *current) 
 116:  {
 117:      if(current != NULL)
 118:      {
 119:          printPostOrder(current->pLeft);
 120:          printPostOrder(current->pRight);
 121:          cout<chValue<<" ";
 122:          return ;
 123:      }
 124:  }
 125:   
 126:  int _tmain(int argc, _TCHAR* argv[])
 127:  {
 128:      //char szPreOrder[TREELEN] = {'z','b','d','c','e','f'}; //非中序遍历结果,结果是错误的
 129:
 130:      //原:
 131:      //char szPreOrder[TREELEN] = {'a','b','a','e','c','f'};
 132:      //char szInOrder[TREELEN] =   {'d','b','a','e','c','f'}; 
 133:
 134:      //有重复字符的结点:结果是错误的
 135:      char szPreOrder[TREELEN] = {'a','a','d','e','c','f'};
 136:      char szInOrder[TREELEN] =   {'d','a','a','e','c','f'}; 
 137:
 138:      Node *pRoot = NULL;
 139:      ReBuild(szPreOrder,szInOrder, TREELEN,&pRoot);
 140:
 141:      cout<<"前序遍历 :";
 142:      printInOrder(pRoot);
 143:      cout<<endl;
 144:
 145:      cout<<"中序遍历 :";
 146:      printPreOrder(pRoot);
 147:      cout<<endl;
 148:
 149:      cout<<"后序遍历 :";
 150:      printPostOrder(pRoot);
 151:      cout<<endl;
 152:
 153:      system("pause");return 0;
 154:  }
 155: