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));
}
};