101. 对称二叉树

· 约 2 分钟阅读 · 次阅读 leetcode

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

示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true

示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false

提示: 树中节点数目在范围 [1, 1000] 内 -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?


递归法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        def helper(p, q):
            if not p and not q:
                return True
            if not p or not q:
                return False
            return p.val == q.val and helper(p.left, q.right) and helper(p.right, q.left)

        if not root:
            return True
        return helper(root.left, root.right)
/**
 * 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 {
    bool helper(TreeNode*p, TreeNode*q) {
        if (p == nullptr && q == nullptr) return true;
        if (p == nullptr || q == nullptr) return false;
        if (p->val != q->val) return false;
        return helper(p->left, q->right) && helper(p->right, q->left);
    }
public:

    bool isSymmetric(TreeNode* root) {
        if (root == nullptr) return true;
        return helper(root->left, root->right);

    }
};

广度优先遍历-队列

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        import queue
        if not root:
            return True
        
        q = queue.Queue()
        q.put(root.left)
        q.put(root.right)
        while q.qsize():
            l = q.get()
            r = q.get()
            if not l and not r:
                continue
            if not l or not r:
                return False
            if l.val != r.val:
                return False
            q.put(l.left)
            q.put(r.right)
            q.put(l.right)
            q.put(r.left)
        return True
/**
 * 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*> Queue;
        Queue.emplace(root->left);
        Queue.emplace(root->right);
        while(!Queue.empty()) {
            auto p = Queue.front(); Queue.pop();
            auto q = Queue.front(); Queue.pop();
            if (p == nullptr && q == nullptr) continue;
            if (p == nullptr || q == nullptr) return false;
            if (p->val != q->val) return false;
            Queue.emplace(p->left);
            Queue.emplace(q->right);
            Queue.emplace(p->right);
            Queue.emplace(q->left);
        }
        return Queue.empty();
    }
};