全部评论 3

  • 看不出来

    #include <iostream>
    #include <cstdio>
    using namespace std;
    struct node{
    	int data;
    	node *left = nullptr, *right = nullptr;//左子树,右子树 
    };
    int a[100005], b[100005];
    node *build(int prest, int preed, int inst, int ined){//构建二叉树 
    	if(prest > preed || inst > ined) return nullptr;//没了
    	node *root = new node;//定义根节点
    	root -> data = a[prest];
    	int idx = -1;
    	for(int i = inst; i <= ined; i++){//找根节点 
    		if(b[i] == a[prest]){//找到了 
    			idx = i;
    			break;
    		}
    	}if(idx == -1) return nullptr;//没找到,输了
    	int leftsize = idx - inst, rightsize = ined - idx; 
    	root -> left = build(prest + 1, prest + leftsize, inst, idx - 1);//左子树
    	root -> right = build(preed - rightsize + 1, preed, idx + 1, ined);//柚子树 
    	if((root -> left == nullptr && leftsize > 0) || (root -> right == nullptr && rightsize > 0)) return nullptr;//左子树没有或者右子树没有都不行
    	return root;
    }int get_(node *root, int ct){
    	if(root == nullptr) return 0;//没了
    	if(root -> left == nullptr && root -> right == nullptr) return ct;
    	return get_(root -> left, ct + 1) + get_(root -> right, ct + 1); 
    }
    int main(){
    	int t, n;
    	scanf("%d", &t);
    	while(t--){
    		scanf("%d", &n);
    		for(int i = 1; i <= n; i++){
    			scanf("%d", a + i);
    		}for(int i = 1; i <= n; i++){
    			scanf("%d", b + i);
    		}
    		node *root = build(1, n, 1, n);//构建
    		printf("%d\n", (root == nullptr ? -1 : get_(root, 0))); 
    	}
    
    	return 0;
    }
    

    2025-07-14 来自 浙江

    0
  • 2025-07-11 来自 山西

    0
  • 我们都不知道 cjdst ACGO ID 是什么(

    2025-07-07 来自 浙江

    0

热门讨论