• LeetCode 101. 对称二叉树(Symmetric Tree)


    题目描述

    给定一个二叉树,检查它是否是镜像对称的。

    例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

        1
       / 
      2   2
     /  / 
    3  4 4  3
    

    但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

        1
       / 
      2   2
          
       3    3
    

    说明:

    如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

    解题思路

    本题可用递归和迭代两种做法来求解。

    递归做法是每次对于对称的两个节点,首先判断是否都为空,若都为空则返回true;否则判断两节点是否相等,若相等则返回它们对应的子节点的比较结果;否则返回false。

    迭代做法是维护一个节点队列,每次取出队列头部两个节点比较其是否相等,若不相等且两节点均不为空,则依次把两个节点对称位置的子节点加入到队列中,注意null也要加入到队列;否则返回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 isSymmetric(TreeNode* root) {
    13         if(root == NULL) return true;
    14         return symmetric(root->left, root->right);
    15     }
    16     bool symmetric(TreeNode* left, TreeNode* right){
    17         if(left == right) return true;
    18         else if(left && right && left->val == right->val){
    19             if(symmetric(left->left, right->right) && symmetric(left->right, right->left)) 
    20                 return true;
    21         }
    22         return false;
    23     }
    24 };

    迭代:

     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) return true;
    14         queue<TreeNode*> q;
    15         q.push(root->left);
    16         q.push(root->right);
    17         while(q.size()){
    18             TreeNode* node1 = q.front();
    19             q.pop();
    20             TreeNode* node2 = q.front();
    21             q.pop();
    22             if(node1 && node2){
    23                 if(node1->val != node2->val) return false;
    24                 else{
    25                     q.push(node1->left);
    26                     q.push(node2->right);
    27                     q.push(node1->right);
    28                     q.push(node2->left);
    29                 }
    30             }
    31             else if(node1 || node2) return false;
    32         }
    33         return true;
    34     }
    35 };
  • 相关阅读:
    Ubuntu自启动服务脚本
    坑(一)—— Django ORM 连接超时的坑
    logging模块详解
    端口扫描之nmap命令
    端口扫描之masscan扫描
    端口扫描之Scapy模块的使用
    端口扫描之开放端口扫描方式
    Android Studio导入Project、Module的正确方法
    ImportError: No module named 'requests'
    运行python程序
  • 原文地址:https://www.cnblogs.com/wmx24/p/9766858.html
Copyright © 2020-2023  润新知