二叉树的遍历
性质:
已知先序序列和中序序列可确定一棵唯一的二叉树;
已知后序序列和中序序列可确定一棵唯一的二叉树;
已知先序序列和后序序列不能确定一棵唯一的二叉树。
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
根据前序和中序遍历输出先序遍历
思路:
前序遍历第一个字母A,必定是这树的根节点。
在中序遍历中找到A的位置,把中序遍历分成两个子树。
取前序遍历中的第二个点B,在分成的两个子树中找到B的位置,再次分成两个子树。
直到分出子树为止。( l == r )
回溯到A点,对右子树进行同样的操作。
input:
DBACEGF (前序)
ABCDEFG (中序)
output:
ACBFGED (后序)
code:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10010;
char a[N],b[N]; // a->前序 b->中序
int idx;
void build(int l,int r){
if(l > r) return;
int u = strchr(b,a[idx])-b; //a[idx]在 b数组的下标位置
idx++;
build(l,u-1); // 左子树区间
build(u+1,r); // 右子树区间
cout << b[u];
}
int main(){
scanf("%s%s",&a,&b);
build(0,strlen(a)-1);
return 0;
}
根据后序和中序遍历输出先序遍历
思路:
与根据前序和中序遍历输出先序遍历相类似;
只是在后序遍历中根结点在末尾;
且把每次递归中“根结点”输出即为前序遍历;
分析+code 传送门