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

3095人阅读 评论(1)

#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;
}

7
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：4219591次
• 积分：34159
• 等级：
• 排名：第136名
• 原创：254篇
• 转载：8篇
• 译文：0篇
• 评论：2659条
博客专栏
 考研复试上机题 文章：14篇 阅读：39407
 IT公司笔试题集锦 文章：18篇 阅读：566211
最新评论