您的位置:首页 > 其它

由二叉树的后序和中序结果求取先序结果

2016-04-03 01:38 253 查看
递归:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string x,y;

void write(int p,int q,int m,int n)
{
if(p>q)return;
if(p==q){cout<<x[p];return;}

int i,j,k;
k=x.find(y
);  //后序的最后一个是根节点
cout<<y
;  //每次输出根节点
//以根节点将中序结果分成左右子树分别进行递归调用
write(p,k-1,m,m+k-p-1);
write(k+1,q,m+k-p,n-1);
}
int main()
{
int i,j,k;
cin>>x>>y;
k=x.length();
write(0,k-1,0,k-1);
return 0;
}


非递归:

#include <iostream>
#include<string.h>
using namespace std;
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char  elem;
};
TreeNode* BinaryTreeFromOrderings(char* inorder, char* postorder, int length)
{
if(length == 0)
{
return NULL;
}
TreeNode* node = new TreeNode;
node->elem = *(postorder+length-1);//后序的最后一个是根节点
cout<<node->elem;
int rootIndex = 0;
for(;rootIndex <length; rootIndex++)
{
if(inorder[rootIndex] == *(postorder+length-1))//找到根节点在中序中的位置
break;
}
//递归左子树
node->left = BinaryTreeFromOrderings(inorder, postorder, rootIndex);
//递归右子树
node->right = BinaryTreeFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex+1));
return node;
}

int main()
{
char* in;
char* po;
int len;
cin>>in;
cin>>po;
len=strlen(in);
BinaryTreeFromOrderings(in, po, len);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: