C ++ 이진 트리 탐색

제목 설명

각 내부 노드 이진 트리 대부분이 개 자식 노드에 있고, 두 개의 자식 노드 트리를 명령했다. 다음과 같이도 이진 트리입니다 :

이진 트리

이진 트리 탐색을 위해 세 가지 기본 방법이 있습니다 :
1. 전순 주사 : 먼저 전에 통과 왼쪽 하위 트리 오른쪽 하위 트리 최종 주문 통과를 예약 주문, 루트를 방문;

2. 예약 주문 : 첫 번째 예약 주문이 하위 트리를 왼쪽, 후 루트 노드를 방문, 마지막 예약 주문 우측 하위 트리;

3. postorder : 전순 주사는 마지막 루트 액세스 한 후, 다음 오른쪽 서브 트리 탐색 순서를 하위 트리를 남겼습니다.

그림의 경우, 결과는 전순 주사의 ABDEHCFGI입니다. 위해 탐색 결과 DBEHAFCIG에서, postorder 탐색 결과는 DHEBFIGCA입니다.

우리는 이제 프리앰블 이진 트리 탐색 순서, 출력 해당 포스트 위해 순회 설명한다.

기입

전순 주사 결과의 첫 라인 전

결과의 선주문 번째 행

모든 대문자와 노드 식별자는 대부분의 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叶子节点
 每次找到叶子节点就输出
*/

추천

출처www.cnblogs.com/LJA001162/p/11334924.html