Hot100-Day44-T101对称二叉树

14 阅读1分钟

Day44[26/4/13]T101对称二叉树

给你一个二叉树的根节点 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

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

解题思路

依旧是递归,但是注意了,这里需要左右侧同层同时递归!

也就是说,递归函数接受两个指针,同时访问左侧和右侧,

并且考虑到对称,你需要考虑到,左侧指针先访问左子树,右侧指针先访问右子树,以这样的顺序进行访问和比较。

然后细节是:为了效率,不要后序遍历(就是先进入递归函数,最后处理自己)

而要前序遍历(先直接判断当前节点相等不,当前节点都不相等了,还有必要看子树吗?不必要,所以优先看自己,所以前序遍历)

Code

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;
        }
        else
        {
            return isMirror(root->left, root->right);
        }
    }

private:
    bool isMirror(TreeNode *left_tree, TreeNode *right_tree)
    {
        if (left_tree == nullptr && right_tree == nullptr)
        {
            return true;
        }

        if (left_tree == nullptr || right_tree == nullptr)
        {
            // 两者不同时未空,但是有一个为空,肯定不相等
            return false;
        }

        if (left_tree->val != right_tree->val)
        {
            return false;
        }

        return (isMirror(left_tree->left, right_tree->right) && isMirror(left_tree->right, right_tree->left));
    }
};