101. 对称二叉树

题目

原题链接 : 101.对称二叉树

题面 :

对于这一题呢,题目要求给出递归和迭代两种方式来解决!!!

注 :

  • 这一题不仅仅是判断左右两个子节点是否对称,而是要遍历两棵树而且要比较内侧和外侧节点

递归

先确认递归三要素 :

  1. 确定递归函数的参数和返回值

    bool cmp(TreeNode* left,TreeNode* right){}

  2. 确认终止条件

  • 左节点和右结点一个非空,那么一定不对称,返回false;
  • 左右结点均为空,那么对称,返回true
  • 均不为空,值不相等,返回false,值相等,返回下一步,即继续向下递归

那么递归函数的整体代码也就写好了 :

cpp 复制代码
    bool cmp(TreeNode* left,TreeNode* right){
        if(left==nullptr && right!=nullptr) return false;
        else if(left!=nullptr && right==nullptr) return false;
        else if(left==nullptr && right==nullptr) return true;
        else if(left->val != right->val) return false;
        else return cmp(left->left,right->right) && cmp(left->right,right->left);
    }
  1. 确认递归的逻辑 :
cpp 复制代码
bool outside = cmp(left->left, right->right);   // 左子树:左、 右子树:右
bool inside = cmp(left->right, right->left);    // 左子树:右、 右子树:左
bool isSame = outside && inside;                    // 左子树:中、 右子树:中(逻辑处理)
return isSame;

那么题解代码也就出来了 :

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool cmp(TreeNode* left,TreeNode* right){
        if(left==nullptr && right!=nullptr) return false;
        else if(left!=nullptr && right==nullptr) return false;
        else if(left==nullptr && right==nullptr) return true;
        else if(left->val != right->val) return false;
        else return cmp(left->left,right->right) && cmp(left->right,right->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return cmp(root->left,root->right);
    }
};

迭代

迭代的思路和想法与递归相同,这里呢,就用queue队列来模拟

详细请看代码 :

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        queue<TreeNode*> que;
        que.push(root->left);
        que.push(root->right);
        while(!que.empty()){
            TreeNode* l = que.front();
            que.pop();
            TreeNode* r = que.front();
            que.pop();
            if(!l && !r) continue;//左右结点均为空,直接下一步;
            if((l&&!r) || (!l&&r)) return false;//左右结点一个为空,返回false;
            if(l->val != r->val) return false;//均不为空但不相等,直接返回false;
            que.push(l->left);
            que.push(r->right);
            que.push(l->right);
            que.push(r->left);
        }
        return true;
    }
};

最后看完,能给个赞吗,hh!!!

相关推荐
啊嘞嘞?1 小时前
力扣(回文链表)
算法·leetcode·链表
Awh-1 小时前
数据结构 第六章:哈希存储
数据结构·算法·哈希算法
M78佐菲1 小时前
Linux学习笔记:目录IO与帧缓冲
linux·笔记·学习·算法
玫瑰互动GEO2 小时前
抖音SEO优化技术拆解:搜索排名四大因子与4步落地算法分析
人工智能·算法·搜索引擎·语音识别
Interview Aid1122 小时前
Akuna OA 题目拆解|三题思路复盘
linux·运维·算法·面试·职场和发展
wabs6662 小时前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录
ZGi.ai2 小时前
ZGI 父子分块:连接检索片段与完整上下文
人工智能·算法·知识库·企业ai·zgi·父子分块
IT毕设实战小研2 小时前
基于大数据的二手车数据分析与预测
java·大数据·后端·爬虫·python·算法·课程设计
Allen_LVyingbo2 小时前
医疗AI可扩展网格信息系统中网格计算技术的智能优化
大数据·人工智能·python·算法·机器学习·django·健康医疗
WBluuue3 小时前
数据结构与算法:带权并查集
数据结构·c++·算法