# 根据树的两种遍历序列求第三种遍历序列

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct BinaryTreeNode
{
char c;
BinaryTreeNode *lchild, *rchild;
BinaryTreeNode()
{
lchild = NULL, rchild = NULL;
}
};
struct BinaryTreeNode *root1,*root2;

char preorder[100], inorder[100], postorder[100];

void preSearch(BinaryTreeNode *root)   //先序遍历树
{
if(root != NULL)
{
printf("%c", root->c);
preSearch(root->lchild);
preSearch(root->rchild);
}
return ;
}

void midSearch(BinaryTreeNode *root)   //中序遍历树
{
if(root != NULL)
{
midSearch(root->lchild);
printf("%c", root->c);
midSearch(root->rchild);
}
return ;
}

void postSearch(BinaryTreeNode *root)  //后序遍历树
{
if(root != NULL)
{
postSearch(root->lchild);
postSearch(root->rchild);
printf("%c", root->c);
}
return ;
}

void BuildTreeFromPreAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和先序求树
{
root = new BinaryTreeNode();
root->c = *(preorder + now);
int pos = (int)(strchr(inorder, *(preorder + now)) - inorder); //查找字符串中首次出现某个字符的位置
now++;
if(now >= len)
return ;
if(pos - 1 >= ll)
{
BinaryTreeNode *t = new BinaryTreeNode();
root->lchild = t;
BuildTreeFromPreAndMid(root->lchild, ll, pos - 1, len, now);
}
if(pos + 1 <= lr)
{
BinaryTreeNode *t = new BinaryTreeNode();
root->rchild = t;
BuildTreeFromPreAndMid(root->rchild, pos + 1, lr, len, now);
}
}

void BuildTreeFromPostAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和后序求树
{
root = new BinaryTreeNode();
root->c = *(postorder + now);
int pos = (int)(strchr(inorder, *(postorder + now)) - inorder);
now--;
if(now < 0)
return ;
if(pos + 1 <= lr)
{
BinaryTreeNode *t = new BinaryTreeNode();
root->rchild = t;
BuildTreeFromPostAndMid(root->rchild, pos + 1, lr, len, now);
}
if(pos - 1 >= ll)
{
BinaryTreeNode *t = new BinaryTreeNode();
root->lchild = t;
BuildTreeFromPostAndMid(root->lchild, ll, pos - 1, len, now);
}
}

//释放二叉树
inline void DeleteBinaryTree(BinaryTreeNode * &root)
{
if(root)
{
DeleteBinaryTree(root->lchild);    //释放左子树
DeleteBinaryTree(root->rchild);    //释放右子树
delete root;          //释放根结点
}
}

int main(void)
{
gets(preorder);
gets(inorder);
//gets(postorder);
int now = 0;
BuildTreeFromPreAndMid(root1, 0, strlen(preorder) - 1, strlen(preorder), now);

//int now2 = strlen(postorder)-1;
//BuildTreeFromPostAndMid(root2, 0, strlen(postorder) - 1, strlen(postorder), now2);

postSearch(root1);
puts("");
DeleteBinaryTree(root1);
/*preSearch(root2);
puts("");
DeleteBinaryTree(root2);*/
return 0;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：根据树的两种遍历序列求第三种遍历序列 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)