タイトル説明
各内部ノードのバイナリツリーは、最大2つの子ノードであり、2つの子ノードがツリーを命じました。次のように図バイナリーツリーは次のとおりです。
バイナリツリートラバーサルのための3つの基本的な方法があります:
1.先行順走査:まず前トラバーサル左サブツリー、右部分木の最終順位トラバーサルを行きがけ、根を訪問します。
2.先行順:最初の行きがけ左のサブツリー、そして、ルートノード、最後の先行順右サブツリーを訪問。
3.後順:先行順走査は、最後のrootアクセスした後、右部分木トラバーサル順序をサブツリーを残しています。
図の場合、結果は先行順走査のABDEHCFGIです。オーダートラバーサル結果DBEHAFCIGでは、後順トラバーサル結果はDHEBFIGCAです。
私たちは今、プリアンブルとバイナリツリートラバーサル順序、出力対応帰りがけ順を説明します。
エントリー
先行順走査結果の最初の行の前に
結果プレオーダーの第2行
すべて大文字、およびノード識別子は、ほとんどの100台のノードで、繰り返されることはありません。
輸出
結果出力前順後
サンプル入力
ABDEHCFGI
DBEHAFCIG
サンプル出力
DHEBFIGCA
ソースコード
#include <iostream>
#include <string.h>
using namespace std;
char a[110],b[110];//a[]是前序遍历的结果 b[]是中序遍历的结果
void dfs(int f1,int e1,int f2,int e2)
{
if(f1>e1) return;//如果找不到子节点就退出(起点大于终点)
int rt=f1;//rt是根节点
int p = 0;
//计算出左子树或者右子树的下一层根节点
for(int i=f2;i<=e2;i++)
if(b[i]==a[rt])//如果找到了顶点
{
p=i;//p代表顶点在b[]里面的位置 即b[p]
break;
}
int ls=p-1-f2+1;//ls表示长度
//int rs=e2-(p+1)+1;
dfs(f1+1,f1+1+ls-1,f2,p-1);//递归处理左子树
//f1+1:a[]的左子树的起点 f1+1+ls-1:a[]的左子树的终点
//f2:b[]的左子树的起点 p-1:b[]的左子树的终点
dfs(f1+1+ls-1+1,e1,p+1,e2);//递归处理右子树
//f1+1+ls-1+1:a[]的右子树的起点 e1:a[]的右子树的终点
//p+1:b[]的右子树的起点 e2:b[]的右子树的终点
printf("%c",a[rt]);//如果这是一个叶节点(既没有左子树,也没有右子树),就输出它
}
int main()
{
//scanf("%s%s",a,b);
cin >> a >> b;
dfs(0,int(strlen(a))-1,0,int(strlen(b))-1);//起点
cout << endl;
return 0;
}
/*
思路总结:
先以a为顶点,递归寻找a的左子树 如果a有左子树,先判断下一个节点b是否为顶点 (判断b是否为顶点:判断b是否有左右子树)
找到b的左子树的下一个节点d 再继续判断d是否有左右子树 如果没有,d为叶节点
在找到b的右子树的下一个节点e 判断e的左右子树 如果有,继续判断下一个节点h是否有左右子树 直到找到h叶子节点
在找到a的右子树的下一个节点c 判断c的左右子树 如果有,继续判断下一个节点 f和g 是否有左右子树 直到找到i叶子节点
每次找到叶子节点就输出
*/