LeetCode101.对称二叉树

在这里插入图片描述


LeetCode101.对称二叉树


题目:

  • 给你一个二叉树的根节点 root , 检查它是否轴对称。

示例:

在这里插入图片描述

  • 输入: r o o t = [ 1 , 2 , 2 , 3 , 4 , 4 , 3 ] root = [1,2,2,3,4,4,3] root=[1,2,2,3,4,4,3]
  • 输出: t r u e true true

解题思路一:(递归)

分别递归外侧是否相同,内侧是否相同,只有当外侧与内侧同时相同才返回true,否则返回false

  1. 确定递归函数的参数和返回值:
bool compare(TreeNode* leftNode, TreeNode* rightNode);
  1. 确定终止条件:
if(leftNode == NULL && rightNode != NULL) return false;
        else if(leftNode != NULL && rightNode == NULL) return false;
        else if(leftNode == NULL && rightNode == NULL) return true;
        else if(leftNode->val != rightNode->val) return false;
  1. 确定单层递归逻辑: 先序遍历顺序为: 左 − > 中 − > 右 左->中->右 >>
bool out = compare(leftNode->left, rightNode->right);
bool in = compare(leftNode->right, rightNode->left);
return out && in;

C++版整体代码

class Solution {
public:
    bool compare(TreeNode* leftNode, TreeNode* rightNode){
        if(leftNode == NULL && rightNode != NULL) return false;
        else if(leftNode != NULL && rightNode == NULL) return false;
        else if(leftNode == NULL && rightNode == NULL) return true;
        else if(leftNode->val != rightNode->val) return false;

        bool out = compare(leftNode->left, rightNode->right);
        bool in = compare(leftNode->right, rightNode->left);
        return out && in;
    } 

    bool isSymmetric(TreeNode* root) {
        if(root == NULL) return true;
        return compare(root->left, root->right);
    }
};

Java版整体代码

class Solution {
    public boolean isSame(TreeNode leftNode, TreeNode rightNode){
        if(leftNode != null && rightNode == null) return false;
        else if(leftNode == null && rightNode != null) return false;
        else if(leftNode == null && rightNode == null) return true;
        else if(leftNode.val != rightNode.val) return false;

        return isSame(leftNode.left, rightNode.right) && isSame(leftNode.right, rightNode.left);
    }
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        return isSame(root.left, root.right);
    }
}

解题思路二:(迭代)

 先将左右节点加入队列中,判断 ① 若左右节点都为空,则对称,返回true ② 若(左空右不空)||(左不空右空)||(左右节点值不同)则返回false。然后依次加入左左、右右、左右、右左节点再次进行判断。

C++实现版本

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        queue<TreeNode*> q;
        if(!root){
            q.push(root->left);
            q.push(root->right);
        }
        while(!q.empty()){
            TreeNode* leftNode = q.front();
            q.pop();
            TreeNode* rightNode = q.front();
            q.pop();
            // 若左右节点都为空,则对称,返回true
            if(!leftNode && !rightNode) return true;
            // 若(左空右不空)||(左不空右空)||(左右节点值不同)则返回false
            if(!leftNode || !rightNode || leftNode->val != rightNode->val) return false;
            q.push(leftNode->left);
            q.push(rightNode->right);
            q.push(leftNode->right);
            q.push(rightNode->left);
        }
        return true;
    }
};
  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值