zoukankan      html  css  js  c++  java
  • Leetcode 101. Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

    For example, this binary tree is symmetric:

        1
       / 
      2   2
     /  / 
    3  4 4  3
    

     

    But the following is not:

        1
       / 
      2   2
          
       3    3
    

     

    Note: Bonus points if you could solve it both recursively and iteratively.

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

     

    分析:这道题既可以用深度优先搜索DFS,也可以用广度优先搜索BFS。

    思路:(1)深度优先搜索的思路为:
    (1)传入root的左子树和右子树。如果两个都为NULL,则是对称的。

    (2)如果两边都不为NULL并且两边的所对应的val相等,那就判断root->left->left和root->right->right是否对称,且判断root->left->right和root->right->left是否对称。。。
    其余情况下return false;

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool func(TreeNode* left, TreeNode* right){
    13         if(left == NULL && right == NULL)
    14             return true;
    15         if(left != NULL && right != NULL && left->val == right->val)
    16             return (func(left->right, right->left) && func(right->right, left->left));
    17         else
    18             return false;
    19     }
    20     bool isSymmetric(TreeNode* root) {
    21         if(root == NULL)
    22             return true;
    23         else
    24             return func(root->left, root->right);
    25     }
    26 };


    (2)用广度优先搜索来做:
    建立两个队列,lq和rq,每次比较队首的两个元素是否相等。
    lq队列的队首l出列后,将它的left和right分别入队;
    rq队列的队首r出列后,将它的right和left分别入队。
    因为判断是否对称是这样比较的:
    l->left 与 r->right
    l->right 与 r->left比较。
     

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool isSymmetric(TreeNode* root) {
    13         if(root == NULL)
    14             return true;
    15         queue<TreeNode*> lq, rq;
    16         TreeNode *l, *r;
    17         lq.push(root->left);
    18         rq.push(root->right);
    19         while(!lq.empty() && !rq.empty()){
    20             l = lq.front();
    21             r = rq.front();
    22             lq.pop();
    23             rq.pop();
    24             if(l == NULL && r == NULL)
    25                 continue;
    26             if(l == NULL || r == NULL || l->val != r->val)
    27                 return false;
    28             lq.push(l->left);
    29             lq.push(l->right);
    30             rq.push(r->right);
    31             rq.push(r->left);
    32         }
    33         if(lq.empty() && rq.empty())
    34             return true;
    35         else
    36             return false;
    37     
    38     }
    39 };
  • 相关阅读:
    Centos 端口被占用,kill被占用的进程
    Centos7 docker安装GitLab
    MongoDB 3.6.1集群部署
    MySql时区修改
    Springboot默认定时任务——Scheduled注解
    Nacos Docker集群部署
    docker-compose使用
    docker部署redis集群
    设置Redis集群访问密码(不停机设置)
    AWS SNS 创建 订阅 发布
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/5503368.html
Copyright © 2011-2022 走看看