LeetCode Daily Question 28

5 月 11 日 每日一题


101. Symmetric Tree

Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).

1
2
Input: root = [1,2,2,3,4,4,3]
Output: true

思路

Recursive 写法:
首先思考问题与子问题的递归关系,可分为三种 case,第一种是只有一个 node,必然 true;第二种是三个 node,需要满足 left->val == right->val;第三种是 height 大于 3 的 completed tree,需要满足 left->val == right->val 并且 left->left tree 与 right->right tree 相同,left->right 与 right->left 相同。
之后思考 base case,left/right 有一个空或全空。
最后将以上归纳为函数代码(首先将 root->left,right)传入函数可以自然判断前两种 case。

Iterative 写法:
逻辑类似 BSF,首先将 root->left,right 放入 queue,while 判断条件为 queue 非空,在 while 内判断 val 并且按递归 case3 的顺序 push 进 queue.

代码

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
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)
return true;
return SymmetricHelper(root->left, root->right);
}
bool SymmetricHelper(TreeNode *left, TreeNode *right){
if(!left || !right)
return left == right;
if(left->val != right->val)
return false;
return SymmetricHelper(left->left, right->right) && SymmetricHelper(left->right, right->left);
}
};


bool isSymmetric(TreeNode* root) {
if(!root) return true;
queue<TreeNode*> queue;
queue.push(root->left);
queue.push(root->right);
while(!queue.empty()) {
TreeNode *left = queue.front(); queue.pop();
TreeNode *right = queue.front(); queue.pop();
if(!left || !right) return left == right;
if(left->val != right->val) return false;
queue.push(left->left);
queue.push(right->right);
queue.push(left->right);
queue.push(right->left);
}
return true;
}
  1. 5 月 11 日 每日一题
    1. 101. Symmetric Tree
    2. 思路
    3. 代码