クラシック面接問題(六)二叉木の再構築
先順遍歴と後順遍歴のツリーを指定し、ツリーを再構築します.例えば,先行ループの結果{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印刷の表示方式があまりよくなく、凝っています.上ノードは、ツリーを表す右ノードであることに注意してください.
コードは以下の通りです
主関数:
Treeヘッダファイル
Treeソースファイル:
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");
}