力扣 101 对称二叉树

这篇博客介绍了如何判断一棵二叉树是否是对称的。提供了递归和迭代两种方法,通过比较左右子树的对应节点是否镜像来实现。递归法中,通过比较根节点的左右子树是否镜像以及它们的子树是否继续镜像来判断。迭代法则利用队列,依次比较左右子树的内侧和外侧节点。两种方法都可以有效地解决这个问题。
摘要由CSDN通过智能技术生成

题目描述

给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ /
2 2
/ / / /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

思路解析:

对于一颗二叉树来判断此树是不是对称,不是比较左右两个孩子节点,而是比较左右两个子树是否是镜像。举个例子,左子树的根节点的左孩子节点要和右子树的根节点的右孩子的值要相等。保证这,即可完成判断。

递归法

    bool mirror(TreeNode* left,TreeNode* right)
    {
        //终止条件
        if(left==NULL && right!=NULL) return false;
        else if(right==NULL && left !=NULL) return false;
        else if(right ==NULL && left==NULL) return true;     //注意此条和下一条不能更换顺序;
        else if(right->val != left->val) return false;      
        //确定单次递归的逻辑
        bool outside=mirror(left->left,right->right);
        bool inside=mirror(left->right,right->left);
        return (outside && inside);
    }
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        return mirror(root->left,root->right);
    }

迭代法

思路:通过队列来判断节点的左子树和右子树的内侧和外侧是否相等;

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        queue<TreeNode*> que;
        que.push(root->left);   // 将左子树头结点加入队列
        que.push(root->right);  // 将右子树头结点加入队列
        while (!que.empty()) {  // 同时弹出左子树和右子树的头结点
            TreeNode* leftNode = que.front(); que.pop();    
            TreeNode* rightNode = que.front(); que.pop();
            if (leftNode== NULL && rightNode==NULL) {  // 左节点为空、右节点为空,
                continue;
            }
            // 左右一个节点不为空,或者都不为空但数值不相同,返回false
            if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) { 
                return false;
                //此条是一个为NULL,一个不是NULL。  或者两者值不相等。
            }
            que.push(leftNode->left);   
            que.push(rightNode->right); // 左节点的左孩子,右节点右孩子
            
            que.push(leftNode->right);  
            que.push(rightNode->left);  // 左节点的右孩子,右节点左孩子
        }
        return true;
    }
};

此题同样可以借助栈来实现非递归判断,只需要将queue改成stack。 que.front() 改成sta.top()即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值