当前位置:   article > 正文

Leetcode:101. 对称二叉树(C++)_leetcode 101 c++

leetcode 101 c++

目录

问题描述:

实现代码:

基于中序遍历(错误方法):

递归:


问题描述:

        给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

实现代码:

基于中序遍历(错误方法):

  1. class Solution {
  2. public:
  3. //中序遍历
  4. void traversal(TreeNode* cur,vector<int>& v)
  5. {
  6. if(cur==NULL)
  7. {
  8. return;
  9. }
  10. traversal(cur->left,v);
  11. v.push_back(cur->val);
  12. traversal(cur->right,v);
  13. }
  14. bool isSymmetric(TreeNode* root)
  15. {
  16. vector<int> v;
  17. traversal(root,v);
  18. int i=0;
  19. int j=v.size()-1;
  20. //判断数组是否对此即可
  21. while(i<j)
  22. {
  23. if(v[i]!=v[j])
  24. {
  25. return false;
  26. }
  27. i++;
  28. j--;
  29. }
  30. return true;
  31. }
  32. };

        此方法就是中序遍历,然后判断结果是对称,看起来很有道理是吧,事实上,确实可以应付绝大部分情况。

        但有某些特定情况就无法给出正确的结果了,例如:[1,2,2,2,null,2]这个二叉树,写出中序遍历[2,2,1,2,2],你会发现它也是对称的,但它却不是一个对称二叉树,所以此方法还需改进,这里我们继续介绍别的方法。

递归:

  1. class Solution {
  2. public:
  3. //比较左右子树
  4. bool compare(TreeNode* left,TreeNode* right)
  5. {
  6. if(left!=NULL&&right==NULL) return false;//左子树不为空,右子树为空
  7. else if(left==NULL&&right!=NULL) return false;//左子树为空,右子树不为空
  8. else if(left==NULL&&right==NULL) return true;//左右子树都为空
  9. else if(left->val!=right->val) return false;//左右子树数值不同
  10. bool outside=compare(left->left,right->right);//比较外侧
  11. bool inside=compare(left->right,right->left);//比较内侧
  12. return outside&&inside;
  13. }
  14. bool isSymmetric(TreeNode* root)
  15. {
  16. if(root==NULL) return true;
  17. bool result=compare(root->left,root->right);
  18. return result;
  19. }
  20. };

原理思路:

        这种方法相当于后序遍历的思路,因为我们要知道左右子树是否相等来向上一层返回,显然后序是符合这种要求的。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/50398
推荐阅读
相关标签
  

闽ICP备14008679号