剑指Offer_28_对称的二叉树
廖家龙 用心听,不照做

❗️LeetCode_101_对称二叉树

题目描述:

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
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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

示例:
输入:root = [1,2,2,3,4,4,3]
输出:true

输入:root = [1,2,2,null,3,null,3]
输出:false

限制:0 <= 节点个数 <= 1000

解法1:递归

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
36
/**
* 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 isSymmetric(TreeNode* root) {

return isSymmetric(root,root);
}

//四步法:
//1.如果两个子树都为空指针,则它们相等或对称
//2.如果两个子树只有一个为空指针,则它们不相等或不对称
//3.如果两个子树根节点的值不相等,则它们不相等或不对称
//4.根据相等或对称要求,进行递归处理

bool isSymmetric(TreeNode* root1,TreeNode* root2) {

if (root1 == NULL && root2 == NULL) return true;

if (root1 == NULL || root2 == NULL) return false;

if (root1 -> val != root2 -> val) return false;

//可以通过比较二叉树的前序遍历序列和对称前序遍历序列(根右左)来判断二叉树是不是对称的,
//如果两个序列是一样的,那么二叉树就是对称的
//注意考虑原书中这种情况:二叉树{7,7,7,NULL,NULL,7,NULL,NULL,7,7,NULL,NULL,NULL}
return isSymmetric(root1->left,root2->right) && isSymmetric(root1->right,root2->left);
}
};