สมมติว่ามี binary tree เราต้องหาสับทรีที่ใหญ่ที่สุดของมัน โดยใหญ่ที่สุดหมายถึงสับทรีที่มีจำนวนโหนดมากที่สุด
เช่น ถ้าอินพุทเป็นแบบ

ผลลัพธ์จะเป็น 3 เนื่องจาก Largest BST Subtree ในกรณีนี้คือส่วนที่ไฮไลท์
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −
กำหนดโครงสร้างชื่อ Data มี 4 ค่า: size, maxVal, minVal, และ ok (ok เก็บได้แค่ true/false)
solve(TreeNode * node)
ถ้า node เป็น null แล้ว −
คืนค่า Data โดยเริ่มต้น (0, infinity, -infinity, true)
left := solve(left ของ node)
right := solve(right ของ node)
กำหนด Data ชื่อ curr
curr.ok := false
ถ้าค่าของ node >= right.minVal แล้ว −
คืนค่า curr
ถ้าค่าของ node <= left.maxVal แล้ว −
คืนค่า curr
ถ้า left.ok เป็น true และ right.ok เป็น true แล้ว −
curr.sz := 1 + left.sz + right.sz
curr.ok := true
curr.maxVal := สูงสุดของ (ค่าของ node และ right.maxVal)
curr.minVal := ต่ำสุดของ (ค่าของ node และ left.minVal)
ถ้า curr.ok เป็น true แล้ว −
ret := สูงสุดของ ret และ curr.sz
คืนค่า curr
จากเมธอดหลัก ทำดังนี้ −
ret := 0
solve(root)
คืนค่า ret
ตัวอย่าง
ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } struct Data{ int sz; int maxVal; int minVal; bool ok; Data(){} Data(int a, int b, int c, bool d){ sz = a; minVal = b; maxVal = c; ok = d; } }; class Solution { public: int ret; Data solve(TreeNode* node){ if (!node) return Data(0, INT_MAX, INT_MIN, true); Data left = solve(node->left); Data right = solve(node->right); Data curr; curr.ok = false; if (node->val >= right.minVal) { return curr; } if (node->val <= left.maxVal) { return curr; } if (left.ok && right.ok) { curr.sz = 1 + left.sz + right.sz; curr.ok = true; curr.maxVal = max(node->val, right.maxVal); curr.minVal = min(node->val, left.minVal); } if (curr.ok) ret = max(ret, curr.sz); return curr; } int largestBSTSubtree(TreeNode* root){ ret = 0; solve(root); return ret; } }; main(){ Solution ob; vector<int> v = {10,5,15,1,8,NULL,7}; TreeNode *root= make_tree(v); cout << (ob.largestBSTSubtree(root)); } อินพุท
[10,5,15,1,8,null,7]
เอาต์พุท
3