1. 题目来源
链接:对称的二叉树
来源:LeetCode——《剑指-Offer》专项
2. 题目说明
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/ \
2 2
\ \
3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
3. 题目解析
方法一:递归+对称前序遍历解法
在《剑指-Offer》上判断这个问题,思路挺不错的,也很容易想到,它构建了一个新的概念:对称前序遍历。
众所周知,二叉树前序遍历就是 首根先左再右,那么以对称的思想来讲,对称前序遍历就要 首根先右再左,并且在此的前序遍历需要将 nullptr
节点也要加上帮助判断,否则某些情况无法进行判断,在此就不列举了。
其实也就是自己跟自己进行比较的过程。
参见代码如下:
// 执行用时 :8 ms, 在所有 C++ 提交中击败了70.40%的用户
// 内存消耗 :19 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return help(root, root);
}
bool help(TreeNode* A, TreeNode* B) {
if (A == nullptr && B == nullptr) return true;
if (A == nullptr || B == nullptr) return false;
if (A->val != B->val) return false;
return help(A->left, B->right) && help(A->right, B->left);
}
};