题目链接:100. 相同的树

题解:

简单判断两颗二叉树是否相同!

题目简述:

给定两颗二叉树,判断是否相同!

题解一:DFS

两树相同,即对应的左子树相同,对应的右子树相同即可!

思路:

  • 左子树相同,并且右子树相同即可,即isSameTree(p->left, q->left) && isSameTree(p->right, q->right)
  • 递归出口:
    • 两子树都空,返回true
    • 一子树空,一子树不空,或者两子树都不空但值不同,返会false

**时间复杂度:**所有节点遍历一次, 为 O(n)

AC代码一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(!p && !q) return true;
if(!p || !q || p->val != q->val) return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};

题解二:BFS

使用BFS来遍历一次两树即可!

思路:

  • 每次都是将同一方向的两树入队,左左右右,使得需要比较的节点为相邻状态即可!
  • 若两树都空,跳过即可,continue
  • 若一树空,一树不空,或者两树都不空但是值不一样,直接返回false
  • 然后按照左左右右顺序入队两棵树
  • 循环结束没有返回false,则最终返回true

很明显,递归更好写!

时间复杂度:遍历一遍所有节点,为O(n)

AC代码二:

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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
queue<TreeNode*> Q;
Q.push(p), Q.push(q);
while(Q.size()){
p = Q.front(), Q.pop();
q = Q.front(), Q.pop();
if(!q && !p) continue;
if(!p || !q || p->val != q->val) return false;
Q.push(p->left), Q.push(q->left);
Q.push(p->right), Q.push(q->right);
}
return true;
}
};