1. 题目
2. 思路
用递归,递归的步骤为:
1.将主问题正确分解为子问题;
2.假设一函数可以解决所有子问题,调用该函数,组合子问题的解来解决主问题;
3.确定递归出口;
4.无条件相信计算机。
1.子问题:判断以root为根结点的树的左右两棵子树是否对称;
2.确定假设函数以及通过子问题解决主问题:假设函数symmetry(L,R)可以判断L和R两棵树是否为对称树,接下来判断L的左子树和R的右子树、L的右子树和R的左子树是否为对称树,若都为对称树,则以root为根的树为对称树。
3.递归出口:
(1)若L和R都为空,返回true;
(2)若L和R一个为空另一个不为空,返回false;
(3)若L和R的值不相等,返回false。
3. 代码
/**
* 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 symmetry(TreeNode* L, TreeNode* R){
if(!L && !R) return true;
if((!L&&R) || (L&&!R)) return false;
if(L->val != R->val) return false;
return symmetry(L->left, R->right) & symmetry(L->right, R->left);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return symmetry(root->left, root->right);
}
};
参考:leetcode题解