先序和中序求后序,后序和中序求先序

//preorder and postorder,先序和中序求后序
#include 
#include 
using namespace std;
void getpost(int *pre, int *in, int n) {  
    if(n == 0) return;  
    int root = pre[0];  
    int i;  
    for(i = 0; i < n; i++) {  
        if(in[i] == root) {  
            break;  
        }  
    }    
    getpost(pre + 1,in,i);//找左子树 
    getpost(pre + i + 1, in + i + 1, n - i - 1); //找右子树 
    cout << ' ' << root; 
    return;
}  
int main() {  
    int pre[40], in[40];  
    int n;  
    cin >> n;  
    int i, j;  
    for(i = 0; i < n; i++) {  
        scanf("%d", &pre[i]);  
    }  
    for(i = 0; i < n; i++) {  
        scanf("%d", &in[i]);  
    }  
    printf("Postorder:");  
    getpost(pre, in, n);  
    printf("\n");  
    return 0;  
} 
//后序和中序求前序
#include 
#include 
using namespace std;
void getpre(int *post, int *in, int n) {  
    if(n <= 0) return;  
    int root = post[n - 1];  
    int i;  
    for(i = 0; i < n; i++) {  
        if(in[i] == root) {  
            break;  
        }  
    }  
     cout << ' ' << root;   
    getpre(post,in,i);//找左子树 //注意不加一因为遍历完左子数遍历右子数,再遍历根结点 
    getpre(post + i, in + i + 1, n - i - 1); //找右子树 
}  
int main() {  
    int post[40], in[40];  
    int n;  
    cin >> n;  
    int i, j;  
    for(i = 0; i < n; i++) {  
        scanf("%d", &post[i]);  
    }  
    for(i = 0; i < n; i++) {  
        scanf("%d", &in[i]);  
    }  
    printf("Preorder:");  
    getpre(post, in, n);  
    printf("\n");  
    return 0;  
} 

//还有就是根据后序和先序,是无法确定中序的,也即无法确定一颗树。

你可能感兴趣的:(二叉树&搜索树&平衡树)