利用递归思想,慢慢分解。
过程中就输出了,所以不需要再重新建立新的二叉树再输出。
思路如下:
如图:假设如下输入
根据二叉树创建的规律,那么我们可以得到第一个根节点,即先序遍历的第一个节点。
先序:根左右 中序:左根右 后序:左右根
再根据中序遍历,我们可以判断出根节点的左儿子所有的节点和右儿子所有的节点
然后把它们拿出来单独看
之后同样的做法
即B为根节点(即A的左孩子),F D 为B的右孩子组成,B无左孩子
…………
递归操作
上代码:
#include <iostream>
#include <cstring>
using namespace std;
void solveIt(char *in, char *pre, int length)
{
if (length <= 0)
{
return;
}
char *p;
for (p = in; p < in + length; p++) //找到中序中的头部在第几个位置
{
if (*p == *pre)
{
break;
}
}
solveIt(in, pre + 1, p - in); //左
solveIt(p + 1, pre + (p - in) + 1, length - (p - in) - 1); //右
cout << *pre; //根
}
int main()
{
char in[200];
char pre[200];
cin >> in >> pre;
solveIt(in, pre, strlen(in));
system("pause");
return 0;
}
中序,后序输出先序也是一样的思路
代码:
#include <iostream>
#include <cstring>
using namespace std;
void solveIt(char *in, char *post, int len)
{
//root = post+len-1
//中左右
if (len <= 0)
{
return;
}
char *p;
for (p = in;p<in+len;p++)
{
if (*p == post[len - 1])
{
break;
}
}
cout << post[len - 1];
solveIt(in, post, p - in);
solveIt(p+1, post + (p-in), len - (p-in) - 1);
}
int main()
{
char in[200];
char post[200];
cin >> in >> post;
solveIt(in, post, strlen(in));
return 0;
}