二叉树遍历
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。
根据前序和中序遍历,求后序遍历
假定一棵二叉树的每个结点都用一个大写字母描述。
给定这棵二叉树的前序遍历和中序遍历,求其后序遍历。
输入样例
ABC
BAC
FDXEAG
XDEFAG
输出样例
BCA
XEDGAF
解题思路
待续。。。
代码实现
#include<iostream>
using namespace std;
string a,b;
void dfs(string a, string b)
{
if(a.size() == 0) return;
char c = a[0];
int k = b.find(c);
dfs(a.substr(1,k),b.substr(0,k));
dfs(a.substr(k + 1),b.substr(k + 1));
cout << c;
}
int main()
{
while(cin >> a >> b)
{
dfs(a,b);
cout << endl;
}
return 0;
}
根据中序和后序遍历,求先序遍历
代码实现
#include<iostream>
using namespace std;
void dfs(string a, string b)
{
if(b.size() < 1) return;
char c = b[b.size() - 1];
int k = a.find(c);
cout << c;
dfs(a.substr(0,k),b.substr(0,k));
dfs(a.substr(k + 1),b.substr(k,b.size() - k - 1));
}
int main()
{
string a,b;
cin >> a >> b;
dfs(a,b);
return 0;
}
根据中序和层次遍历,求先序遍历
假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。
输入样例
DBEAC
ABCDE
输出样例
ABDEC
解题思路
整体思想和前两题相同,不同的是在层次遍历中无法简单缺点递归的左右字串,刚好最近学了哈希,在中序遍历中确定树根的位置,遍历左字串建立hash,然后再遍历level确定sublevel1和sublevel2。
代码实现
#include<iostream>
using namespace std;
string a,b;
void dfs(string a, string b)
{
if(b.size() == 0) return;
char c = b[0];
int k = a.find(c);
int ha[26] = {0};
for(int i = 0; i < k; ++ i)
{
ha[a[i] - 'A'] ++;
}
string sublevel1, sublevel2;
for(int i = 1; i < b.size(); ++ i)
{
if(ha[b[i] - 'A'])
{
sublevel1 += b[i];
ha[b[i] - 'A'] --;
}
else sublevel2 += b[i];
}
cout << c;
dfs(a.substr(0,k),sublevel1);
dfs(a.substr(k + 1),sublevel2);
}
int main()
{
cin >> a >> b;
dfs(a,b);
cout << endl;
return 0;
}