LeetCode.101.对称二叉树

题目

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

依旧是使用迭代和递归来完成

对于递归算法的话需要思考三要素,输入的话我们只需要选择一个节点的左右孩子即可,单次循环结束的条件的话有以下几种情况:左右都没孩子,那就是对称的了;左右只有一边有孩子,那就是不对称的了;左右都有孩子但是值不相等,那就是不对称了。需要注意的是并不是左右的节点相等就是对称了,单次循环并不代表整棵树。最后就是每次循环的逻辑,对于二叉树而言,整棵树的对称是最左侧和最右侧,然后再往里一侧,这样对称的,所以我们一开始选择比较的节点很重要,需要选择左节点的左子树&&右节点的右子树,还有左节点的右子树&&右节点的左子树,这样子去完成每一次的递归。

cpp 复制代码
class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right) {
        if (left == NULL && right != NULL) return false;
        else if (left != NULL && right == NULL) return false;
        else if (left == NULL && right == NULL) return true;
        else if (left->val != right->val) return false;

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

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

对于迭代的话,我用队列去实现。一开始先把根节点的左右节点压进来,之后依次出队,如果说两边都空那对称直接继续;如果说如果说只有单边或者两边不相等,那么就false。之后再按左节点的左子树->右节点的右子树->左节点的右子树->右节点的左子树的顺序来入队,如果while循环能出来的直接true没问题。

cpp 复制代码
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 && !rightnode) {
                continue;
            }

            if ((!leftnode || !rightnode || (leftnode->val != rightnode->val))) {
                return false;
            }

            que.push(leftnode->left); 
            que.push(rightnode->right);
            que.push(leftnode->right);
            que.push(rightnode->left);
        }
        return true;
        
    }
};
相关推荐
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出数轴移动中只出现一次的指令——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
重生之小比特1 小时前
【算法拾光】双指针|移动零 + 复写零
数据结构·c++·算法
动词ing4 小时前
[题目练习】三数之和
数据结构
YSL0701244 小时前
一文通关-----栈和队列
开发语言·数据结构
垆边人似月.5 小时前
找出最小的 K 个数
数据结构·c++·算法
Logic1016 小时前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
mmmmath_36 小时前
LeetCode.637.二叉树的层平均值
算法·leetcode
Tisfy6 小时前
LeetCode 2913.子数组不同元素数目的平方和 I:第一题先常数很大的O(n^2)
算法·leetcode·题解·模拟·暴力
从小白到软工6 小时前
4-1 指针
c语言·开发语言·数据结构·经验分享·ai编程