zoukankan      html  css  js  c++  java
  • 对称的二叉树

    【问题】请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

    【思路】首先使用递归得方法,代码非常得简洁,如果l与r都是nullptr,那么就返回真,如果只有其中一个为nullptr,那么一定不是对称二叉树,则返回false,如果都不是nullptr,则需要判断其值是否相等,并且还要递归判断(l.left, r.right)和(l.right, r.left)两组数是否相等!

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };
    10 */
    11 class Solution {
    12 public:
    13     bool isSymmetrical(TreeNode* pRoot)
    14     {
    15         if(pRoot == nullptr)  return true;
    16         return process(pRoot->left, pRoot->right);
    17     }
    18 private:
    19     bool process(TreeNode* l, TreeNode* r){
    20         if(l == nullptr && r == nullptr)
    21             return true;
    22         if(l != nullptr && r != nullptr)
    23             return l->val == r->val && 
    24             process(l->left, r->right) &&
    25             process(l->right, r->left);
    26         return false;
    27     }
    28 };

    另一种方法,可以使用类似于层次遍历的方式,使用一个队列的方式,每次将成对的元素入堆,然后成对的取出,并进行值得判断,如果相等,则进行下一次判断,不过不相等,返回false。注意,如果两者都是nullptr,则下面不执行,如果只有一个为nullptr,则返回false,因为此时成对元素已经不满足对应相等了!

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };
    10 */
    11 class Solution {
    12 public:
    13     bool isSymmetrical(TreeNode* pRoot)
    14     {
    15         if(pRoot == nullptr)  return true;
    16         queue<TreeNode*> q;
    17         q.push(pRoot->left);
    18         q.push(pRoot->right);
    19         while(!q.empty()){
    20             // 成对的取出元素
    21             TreeNode* left = q.front();
    22             q.pop();
    23             TreeNode* right = q.front();
    24             q.pop();  // 删除头节点
    25             if(left == nullptr && right == nullptr) continue;
    26             if(left == nullptr || right == nullptr) return false;
    27             if(left->val != right->val) return false;
    28             // 成对的插入元素
    29             q.push(left->left);
    30             q.push(right->right);
    31             q.push(left->right);
    32             q.push(right->left);
    33         }
    34         return true;
    35     }
    36 };
  • 相关阅读:
    数据库内外连接以及自然连接
    Mybatis的一级二级缓存
    彻底弄懂CAS单点登录
    Tomcat部署项目的方式
    redis集群脑裂以及解决方案
    AOP分析--代理方式的选择
    线程池
    数据结构--结构体
    Python程序--选择判断
    C语言--密码问题
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11459228.html
Copyright © 2011-2022 走看看