クラシック面接問題(六)二叉木の再構築


先順遍歴と後順遍歴のツリーを指定し、ツリーを再構築します.例えば,先行ループの結果{1,2,4,7,3,5,6,8}は,中間ループの結果{4,7,2,1,5,3,8,6}は,最後に二叉木を得る.
root-1 left-2 left-4 right-7 right-3 left-5 right-6 left-8印刷の表示方式があまりよくなく、凝っています.上ノードは、ツリーを表す右ノードであることに注意してください.
コードは以下の通りです
主関数:
#include "Tree.h"

int main(){
  int inorder[] = {4,7,2,1,5,3,8,6};
  int preorder[]= {1,2,4,7,3,5,6,8};
  TreeNode* root = rebuild(inorder,preorder,8);
  preorder_printTree(root);
  delete root;
  system("PAUSE");
}

Treeヘッダファイル
#include 

class TreeNode{
public:
  TreeNode* m_pLeft;
  TreeNode* m_pRight;
  int       value;  
  TreeNode(int v){
    value   = v;
    m_pLeft = NULL;
    m_pRight= NULL;
  }
  ~TreeNode(){
    if(!m_pLeft){
      delete m_pLeft;
      m_pLeft = NULL;
    }
    if(!m_pRight){
      delete m_pRight;
      m_pRight = NULL;
    }
  }
};

TreeNode* rebuild(int* inorder, int* preorder, int len);
void preorder_printTree(TreeNode* root);

Treeソースファイル:
#include "Tree.h"
#include 
//using namespace std;


TreeNode* rebuild(int* inorder, int* preorder, int len){
  if(!inorder || !preorder || 0 == len)
    return NULL;
  int llen = 0;
  for( ; llen < len; ++llen){
    if(inorder[llen]==preorder[0])
      break;
  }
  int rlen = len-llen-1;
  int* left = inorder;
  int* right= inorder+llen+1;
  TreeNode* root = new TreeNode(preorder[0]);
  root->m_pLeft = rebuild(left, preorder+1, llen);
  root->m_pRight= rebuild(right,preorder+llen+1,rlen);
  return root;
}


void preorder_printTree(TreeNode* root, int level, const char type[]){   
  if(!root)  
    return;  
  for(int i = 0 ; i < level ; i++)
    std::cout<value<<:endl preorder_printtree="">m_pLeft, level+1,"left");
  preorder_printTree(root->m_pRight, level+1,"right");
}


void preorder_printTree(TreeNode* root){
  preorder_printTree(root,0,"root");
}