您的位置:首页 > 其它

重建二叉树

2016-03-22 21:43 218 查看
题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列,如果如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。

算法:

#include<iostream>

using namespace std;
int tags = 0;

typedef struct BinaryTreeNode{              //二叉树的结构体
int data;
struct BinaryTreeNode *left;
struct BinaryTreeNode *right;
}BinaryTreeNode;

BinaryTreeNode* construct(int *startPreorder, int *endPreorder, int *startInorder, int *endInorder){             //核心算法

int rootValue = startPreorder[0];
BinaryTreeNode *root =  new BinaryTreeNode();
root->data = rootValue;
root->left = NULL;
root->right = NULL;

if(startPreorder == endPreorder){                                                 //如果树的前序和中序只有一个节点,且相等则返回根节点,并致标志位为1
if(startInorder == endInorder && *startPreorder == *startInorder){
tags = 1;
return root;
}
else{                                                          //否则将标志位置0
//throw exception("Invalid input.");
tags = 0;
return NULL;
}
}

int *rootInorder = startInorder;

while(rootInorder <= endInorder && *rootInorder != rootValue){                            //在中序序列中找到根节点的位置
++rootInorder;
}

if(rootInorder == endInorder && *rootInorder != rootValue){
//    throw exception("Invalid input.");
tags = 0;
return NULL;
}

int leftLength = rootInorder - startInorder;
int *leftPreorderEnd = startPreorder + leftLength;
// 递归进行左右紫子树的构造
if(leftLength > 0){
root->left = construct(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1);
}

if(leftLength < endPreorder - startPreorder){
root->right = construct(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder);
}

return root;
}

BinaryTreeNode* constructCore(int *preorder, int *inorder, int length){
if(preorder == NULL || inorder == NULL || length <= 0){                   //检查是否构成树
return NULL;
}

return construct(preorder, preorder + length - 1, inorder, inorder + length - 1);
}

void post_order(BinaryTreeNode *r)              //后序遍历输出节点
{
BinaryTreeNode *pNode = r;
if(pNode != NULL)
{
post_order(pNode->left);
post_order(pNode->right);
cout<<pNode->data<<' ';
}
}

int main(){
int n;
int pre[1010], in[1010];
while(cin>>n){                            //输入格式定义,先输入节点数,再输入先序和中序序列
for(int i = 0; i < n; i++){
cin>>pre[i];
}

for(int j = 0; j < n; j++){
cin>>in[j];
}

BinaryTreeNode *Root = constructCore(pre, in, n);

if(tags){
post_order(Root);
}
else{
cout<<"No"<<endl;
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: