JZ28 对称的二叉树
描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的

下面这棵二叉树不对称。

数据范围:节点数满足 $0≤n≤1000$,节点上的值满足 $∣val∣≤1000$
要求:空间复杂度 $O(n)$,时间复杂度 $O(n)$
备注:你可以用递归和迭代两种方法解决这个问题
示例1
1 2
| 输入:{1,2,2,3,4,4,3} 返回值:true
|
示例2
1 2
| 输入:{8,6,9,5,7,7,5} 返回值:false
|
题解
初见思路:看到这道题就想到了JZ27二叉树的镜像,当时的实现方式是用队列做层序遍历,然后层序遍历的时候检查每一层是否镜像对称,但是考虑图2的情况,层序遍历好像不好用。这题为什么是简单??
问了大G老师写的,递归写法重点在于往下递归的时候是$leftRoot->left$和$rightRoot->right$比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
class Solution { public:
bool isSymmetrical(TreeNode* pRoot) { if (!pRoot) return true;
return isMirror(pRoot->left, pRoot->right);
} private:
bool isMirror(TreeNode* leftRoot, TreeNode* rightRoot) { if (!leftRoot && !rightRoot) return true;
if (!leftRoot || !rightRoot) return false;
return (leftRoot->val == rightRoot->val) && isMirror(leftRoot->left, rightRoot->right) && isMirror(leftRoot->right, rightRoot->left); } };
|