string容器07之string字串的插入與刪除
阿新 • • 發佈:2021-02-09
技術標籤:LeetCode
100. 相同的樹
題目描述
給你兩棵二叉樹的根節點 p
和 q
,編寫一個函式來檢驗這兩棵樹是否相同。
如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。
示例 1:
輸入:p = [1,2,3], q = [1,2,3]
輸出:true
示例 2:
輸入:p = [1,2], q = [1,null,2]
輸出:false
示例 3:
輸入:p = [1,2,1], q = [1,1,2]
輸出:false
提示:
- 兩棵樹上的節點數目都在範圍
[0, 100]
內 -
−
1
0
4
≤
N
o
d
e
.
v
a
l
≤
1
0
4
-10^4 \le Node.val \le 10^4
題解:
判斷兩棵樹是否相同,對兩棵樹做同樣的操作:深搜(先序,中序,後序)或者 廣搜,判斷對應的節點是否相同即可。
這裡使用 二叉樹先序遍歷 搜尋方式來遍歷。
時間複雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
額外空間複雜度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
/**
* 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;
if ( !isSameTree( p->left, q->left ) ) return false;
if ( !isSameTree( p->right, q->right ) ) return false;
return true;
}
};
/*
時間:0ms,擊敗:100.00%
記憶體:9.6MB,擊敗:96.96%
*/
迭代實現 先序遍歷 判斷:
寫法一:
/**
* 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) {
stack<TreeNode*> stk1, stk2;
stk1.push( p ), stk2.push( q );
while ( stk1.size() && stk2.size() ) {
p = stk1.top(); stk1.pop();
q = stk2.top(); stk2.pop();
if ( !p && !q ) continue;
if ( !p || !q || p->val != q->val ) return false;
stk1.push( p->right );
stk1.push( p->left );
stk2.push( q->right );
stk2.push( q->left );
}
return true;
}
};
/*
時間:0ms,擊敗:100.00%
記憶體:9.9MB,擊敗:69.88%
*/
寫法二:
/**
* 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) {
stack<TreeNode*> stk;
stk.push( p );
stk.push( q );
TreeNode *t1, *t2;
while ( stk.size() ) {
t1 = stk.top(); stk.pop();
t2 = stk.top(); stk.pop();
if ( !t1 && !t2 ) continue;
if ( !t1 || !t2 || t1->val != t2->val ) return false;
stk.push(t2->right);
stk.push(t1->right);
stk.push(t2->left);
stk.push(t1->left);
}
return true;
}
};
/*
時間:0ms,擊敗:100.00%
記憶體:9.8MB,擊敗:70.76%
*/
寫法三:
/**
* 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) {
stack<TreeNode*> stk1, stk2;
while ( p || stk1.size() || q || stk2.size() ) {
while ( p || q ) {
if ( (p && !q) || (q && !p) ) return false;
if ( p->val != q->val ) return false;
stk1.push( p );
stk2.push( q );
p = p->left;
q = q->left;
}
p = stk1.top(); stk1.pop();
q = stk2.top(); stk2.pop();
p = p->right;
q = q->right;
}
return true;
}
};
/*
時間:0ms,擊敗:100.00%
記憶體:9.8MB,擊敗:80.31%
*/