概述
只知道先序序列和后序序列是无法求出唯一的树,所以不做讨论。
#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;
}
最后
以上就是飘逸小刺猬为你收集整理的根据树的两种遍历序列求第三种遍历序列的全部内容,希望文章能够帮你解决根据树的两种遍历序列求第三种遍历序列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复