发布剪枝代码

wangjiajian  •  2年前


  1. 遍历每一个节点, 作为根节点, 找对称
  2. 统计对称二叉树节点
  3. 比大小
    就是书上的思路,加两个剪枝 : 判断左右对称 和 判断权值对称
    就过了
#include <bits/stdc++.h>
using namespace std;

bool flag;  // 是否对称
int n, ans=1, l[1000001], r[1000001], v[1000001];

int dfs(int x, int y, int s) {	// s代表节点数 x,y为正在访问的节点标号
    if(x==-1 && y==-1)
        return 0;
    if(x==-1 || (y==-1 && x!=y)) {	//判断左右对称
        flag = 1;
        return 0;
    }
    if(v[x] != v[y]) {	//判断权值不对称
        flag = 1;
        return 0;
    }
    return dfs(l[x], r[y], 2) + dfs(r[x], l[y], 2) + s;  // 下面节点数 加 上面节点数
}

int main() {
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", v+i);
    for(int i=1; i<=n; i++)
        scanf("%d%d", l+i, r+i);
    for(int i=1; i<=n; i++) {
        int s = dfs(l[i], r[i], 3);   // 直接从访问的节点的左孩子和右孩子开始, 初始节点为3
        if(s>ans && flag==0)
            ans = s;
        flag = 0;  // 清楚
    }
    printf("%d", ans);
    return 0;
}

评论: