当前位置:   article > 正文

P5018 [NOIP2018 普及组] 对称二叉树

p5018 [noip2018 普及组] 对称二叉树

知识点:二叉树

难度:4

这个题是求一个二叉树里面最大的对称子树的节点个数,不会什么树哈希,就用了暴力方法,虽然数据很大,但是这时普及组的题,不太会考察什么高级的知识,就用了暴力,就是一遍递归,一遍判断,更新答案,如果当前节点是对称的,那么就不向下递归了,然后问题就分解成了怎么判断一个二叉树是不是对称的,这个我们可以用原来的二叉树构建出的一棵所有左右孩子都对换的二叉树来与原二叉树做比较,分类讨论就行了,比较的过程中来记录节点数,空的时候不要记录,

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e6 + 5;
  4. struct node {
  5. int val, l, r;
  6. } tr[N];
  7. int cnt, ans;
  8. bool judge(int root1, int root2) {
  9. if (root1 == -1 && root2 == -1) return true;
  10. if (root1 == -1 && root2 != -1 || root1 != -1 && root2 == -1) return false;
  11. cnt++;
  12. if (tr[root1].val != tr[root2].val) return false;
  13. return judge(tr[root1].l, tr[root2].r) && judge(tr[root1].r, tr[root2].l);
  14. }
  15. void solve(int root) {
  16. if (root == -1) return;
  17. cnt = 0;
  18. bool flag = judge(root, root);
  19. if (flag) { ans = max(ans, cnt); return; }
  20. solve(tr[root].l);
  21. solve(tr[root].r);
  22. }
  23. int main() {
  24. int n;
  25. cin >> n;
  26. for (int i = 1; i <= n; i++) cin >> tr[i].val;
  27. for (int i = 1; i <= n; i++) cin >> tr[i].l >> tr[i].r;
  28. solve(1);
  29. cout << ans;
  30. return 0;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/731976
推荐阅读
相关标签
  

闽ICP备14008679号