สมมติว่าเรามีต้นไม้ไบนารีที่มีโหนดรูทและลูกด้านซ้ายและลูกด้านขวา ภารกิจคือการหาผลรวมของโหนดปลายสุดของต้นไม้ซึ่งเหลือไว้ที่โหนดหลัก
ตัวอย่าง
อินพุต-1:
ผลลัพธ์:
15
คำอธิบาย: ในไบนารีทรีอินพุตที่กำหนด ผลรวมของลีฟโหนดด้านซ้ายทั้งหมดคือ 9+4+2 =15 ดังนั้น เอาต์พุตคือ 15
แนวทางในการแก้ปัญหานี้
เรามี Binary Tree และภารกิจคือการหาผลรวมของ leaf nodes ทั้งหมดที่เหลืออยู่ใน parent.
วิธีการแบบเรียกซ้ำในการแก้ปัญหานี้คือตรวจสอบว่าโหนดด้านซ้ายของโหนดรากว่างเปล่าหรือไม่ หากว่างเปล่า ให้คำนวณผลรวมสำหรับโหนดด้านซ้ายและค้นหาผลรวมแบบเรียกซ้ำสำหรับโหนดด้านขวา ดังนั้น สำหรับทุกโหนด เราจะตรวจสอบซ้ำๆ และหาผลรวมของโหนดนั้น
- นำ Binary Tree ที่มีโหนดรูทและลูกด้านซ้ายและชายด์ด้านขวาเป็นอินพุต
- ฟังก์ชันจำนวนเต็ม leftLeafSum(treenode*root) รับโหนดรูทเป็นอินพุตและส่งกลับผลรวมของลีฟโหนดทั้งหมดที่เหลือให้พาเรนต์
- หากโหนดรูทว่างเปล่าหรือเป็น NULL ให้คืนค่า 'ศูนย์' มิฉะนั้น ให้ตรวจสอบโหนดด้านซ้ายของโหนดรูท
- หากโหนดด้านซ้ายของโหนดรากไม่มีลูก ให้ตรวจสอบโหนดที่ถูกต้องซ้ำๆ
- คืนค่าผลรวมแบบวนซ้ำสำหรับเด็กด้านซ้ายและชายที่ถูกต้อง
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; struct treenode { int data; treenode * left; treenode * right; }; struct treenode * createNode(int d) { struct treenode * root = new treenode; root -> data = d; root -> left = NULL; root -> right = NULL; return root; } int leftLeafSum(treenode * root) { if (root == NULL) { return 0; } if (root -> left and!root -> left -> left and!root -> left -> right) { return root -> left -> data + leftLeafSum(root -> right); } return leftLeafSum(root -> left) + leftLeafSum(root -> right); } int main() { struct treenode * root = NULL; root = createNode(4); root -> left = createNode(2); root -> right = createNode(2); root -> left -> right = createNode(7); root -> left -> left = createNode(5); root -> right -> left = createNode(5); root -> right -> right = createNode(7); int sum = leftLeafSum(root); cout << sum << endl; return 0; }
การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
ผลลัพธ์
10
คำอธิบาย: โหนดปลายสุดในโหนดด้านซ้ายคือ 5 และ 5 ซึ่งเหลือไว้ให้แม่ ดังนั้นผลรวมของโหนดปลายสุดคือ =10