给定先序遍历与后序遍历的二叉树,重构该二叉树。例如先序遍历的结果{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 <cstdlib>
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 <iostream>
//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<<"\t";
std::cout<<type<<"-"<<root->value<<std::endl;
preorder_printTree(root->m_pLeft, level+1,"left");
preorder_printTree(root->m_pRight, level+1,"right");
}
void preorder_printTree(TreeNode* root){
preorder_printTree(root,0,"root");
}