题目
LeetCode_101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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. 与LeetCode_100.相同的树相似,区别在于100判断两数的左右子树是否分别相等,本题判断左子树与右子树是否对称。
2. 先赋予 judge
函数语义:判断 p 为根的树和 q 为根的树是否对称。
3. 总体思路: 判断该树是否对称,等价于判断两棵相同的树是否对称。先判断根节点值是否相等,再调用 judge
函数判断第一棵树的左子树和第二棵树的右子树是否对称,以及第一棵树的右子树和第二棵树的左子树是否对称,都对称,则原树对称。
4. 设计函数: 如果根节点都为空,说明两树对称,返回 true
如果不满足都为空,但其中一棵树为空,或者都不为空但 节点值不等,说明两树不对称,返回 false
然后判断左右子树是否对称,将判断结果返回,如果都对称则 p
和 q
对称,否则不对称。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool judge(struct TreeNode* p, struct TreeNode* q) {
if (p == NULL && q == NULL) return true;
if (p == NULL || q == NULL || p->val != q->val) {
return false;
}
return judge(p->left, q->right) && judge(p->right, q->left);
}
bool isSymmetric(struct TreeNode* root) {
return judge(root, root);
}