
題目解析: 給定兩棵二元樹,判斷從左到右所有的葉子節點數值排出來是不是一模一樣
解題思路: 設一個佇列v裝第一棵樹的葉子,寫一個DFS函數跑第一棵樹,遇到葉子就塞進v。再寫一個solve函數跑第二棵樹,遇到葉子就跟v最前面的比對,不一樣就標記錯誤,一樣就把v最前面拔掉。最後回傳結果狀態
class Solution {
public:
bool check = true;
queue v;
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
DFS(root1);
solve(root2);
return check && v.empty();
}
void DFS(TreeNode* now) {
if (now->left == nullptr && now->right == nullptr) {
v.push(now->val);
return;
}
if (now->left != nullptr) DFS(now->left);
if (now->right != nullptr) DFS(now->right);
}
void solve(TreeNode* now) {
if (!check) return;
if (now->left == nullptr && now->right == nullptr) {
if (v.empty() || v.front() != now->val) {
check = false;
} else {
v.pop();
}
return;
}
if (now->left != nullptr) solve(now->left);
if (now->right != nullptr) solve(now->right);
}
};

題目解析: 找出一棵二元樹的最大深度,也就是從根節點走到最遠葉子節點的長度
解題思路: 設變數ans記最大深度。根節點不為空就丟進DFS遞迴,初始深度設為1。每次往下跑就把ans更新為最大的深度,並往左右節點繼續遞迴且深度加1,最後回傳ans
class Solution {
public:
int ans = 0;
int maxDepth(TreeNode* root) {
if(root != nullptr){
DFS(root, 1);
}
return ans;
}
void DFS(TreeNode* now, int q){
ans = max(ans, q);
if(now->left != nullptr){
DFS(now->left, q+1);
}
if(now->right != nullptr){
DFS(now->right, q+1);
}
}
};

題目解析: 給定偶數長度的鏈結串列,頭尾對稱位置的節點互相配對,找出加起來最大的配對總和
解題思路: 設一個陣列v,丟進迴圈把鏈結串列每個節點的數值都塞進去。接著再跑一個迴圈,把陣列頭尾對稱位子的數字相加,不斷把最大值更新給ans,最後回傳ans
class Solution {
public:
int pairSum(ListNode* head) {
int ans = 0;
vector v;
ListNode* p = head;
while(p != nullptr){
v.push_back(p->val);
p = p->next;
}
for(int i=0; i<v.size(); i++){
ans = max(ans, v[i]+v[v.size()-1-i]);
}
return ans;
}
};