สมมติว่าเรามีรูทของต้นไม้ไบนารี เราต้องนับจำนวนโหนดที่ค่าของมันมากกว่าหรือเท่ากับค่าของลูกหลานทั้งหมด
เช่น ต้นไม้ที่มีโครงสร้างดังภาพ ผลลัพธ์จะเป็น 4 เนื่องจากทุกโหนดยกเว้น 3 ตรงตามเงื่อนไข
ขั้นตอนการแก้ปัญหา
- ฟังก์ชัน dfs(node): คืนค่าค่าสูงสุดในซับทรีที่รากคือ node
- ถ้า node เป็น null: return 0
- l = dfs(node->left), r = dfs(node->right)
- ถ้า node->val >= max(l, r): เพิ่ม contet ret
- return max(node->val, l, r)
- จาก main: ret = 0, เรียก dfs(root), คืนค่า ret
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) { val = data; left = right = NULL; }
};
class Solution {
public:
int ret;
int dfs(TreeNode* node) {
if (!node) return 0;
int l = dfs(node->left);
int r = dfs(node->right);
if (node->val >= max(l, r)) ret++;
return max({node->val, l, r});
}
int solve(TreeNode* root) {
ret = 0;
dfs(root);
return ret;
}
};
int main() {
Solution ob;
TreeNode *root = new TreeNode(7);
root->left = new TreeNode(4);
root->right = new TreeNode(3);
root->right->left = new TreeNode(7);
root->right->right = new TreeNode(5);
cout << (ob.solve(root));
}
อินพุต
TreeNode *root = new TreeNode(7); root->left = new TreeNode(4); root->right = new TreeNode(3); root->right->left = new TreeNode(7); root->right->right = new TreeNode(5);
เอาต์พุต
4