[AcWing]39. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。

如果一棵二叉树和它的镜像一样,那么它是对称的。

数据范围

树中节点数量 [0,100]

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:
1
/ \
2 2
/ \ / \
3 4 4 3

如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树:
1
/ \
2 2
\ / \
4 4 3

算法思路

image-20230414225426092

代码实现

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
/**
* 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 dfs(TreeNode* pA, TreeNode* pB){
// 如果左根节点和右根节点有一个为空,那么只有它两都为空的时候才是true,否则是false
if(!pA || !pB) return !pA && !pB;
// 左右根节点都存在的情况
// 左右节点根节点值不同,则不对称
if(pA -> val != pB -> val) return false;
// 左右根节点都存在,且值相同,比较他们的子树
return dfs(pA -> left, pB -> right) && dfs(pA -> right, pB -> left);
}

bool isSymmetric(TreeNode* root) {
// 如果根节点是空的那么一定是对称的(规定如此)
if(!root) return true;
// 判断左右子树是不是镜像的
return dfs(root -> left, root -> right);
}
};

时间复杂度

从上到下每个节点仅被遍历一遍,所以时间复杂度是 O(n)