描述
给定一个二叉树,检查它是否是镜像对称的。
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
思路:
前面的几道题都是把树抽象成只含有root结点和其左右孩子结点的一棵树,然后按照博客中的三部曲来解题。仔细读这道题,发现比较特殊,如果按照这种抽象的方式,那么判断的将是根结点的左右孩子的值是否相等(即对称),但题目要求的是镜像对称。所以,本题的特殊之处在于,要将整个二叉树抽象成两棵二叉树,对两棵树的结点进行比较。假设为A、B两棵树,其都有自己的左右孩子结点。需要比较A的左孩子和B的右孩子是否相等,A的右孩子和B的左孩子是否相等。所以需要新建一个用来递归的函数,形参为两棵树的root结点,自顶向下地判断。

三部曲开始:
- 递归的出口:什么时候递归结束?有三种情况需要结束:
(1)A、B都是空结点,则对称;
(2)A的左孩子为空而B的右孩子不为空或A的右孩子为空而B的左孩子不为空,则不对称;
(3)A的左孩子值 != B的右孩子值或A的右孩子值 != B的左孩子值,则不对称。 - 返回什么信息:返回的就是A和B两棵树是否镜像对称(true或false)。
- 本层递归做什么:对AB两棵树进行对称比较。
若思路不对欢迎指正!
解答
/**
* 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 recu(TreeNode* nLeft, TreeNode* nRight){
if(nLeft == NULL && nRight == NULL) return true;
if(nLeft == NULL || nRight == NULL) return false;
if(nLeft->val != nRight->val) return false;
return recu(nLeft->left, nRight->right) && recu(nLeft->right, nRight->left);
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return recu(root->left, root->right);
}
};
该博客探讨了一种解决二叉树镜像对称性问题的方法。通过递归方式,比较二叉树的左右子树是否互为镜像,实现了判断一棵二叉树是否对称的功能。关键在于递归过程中比较左右子节点的对应关系,直到找到所有节点的对称匹配或发现不匹配的情况。

393

被折叠的 条评论
为什么被折叠?



