Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาผลรวมของโหนดลีฟด้านซ้ายของต้นไม้ไบนารีที่กำหนดใน C++


สมมติว่าเรามีต้นไม้ไบนารีที่มีโหนดรูทและลูกด้านซ้ายและลูกด้านขวา ภารกิจคือการหาผลรวมของโหนดปลายสุดของต้นไม้ซึ่งเหลือไว้ที่โหนดหลัก

ตัวอย่าง

อินพุต-1:

ค้นหาผลรวมของโหนดลีฟด้านซ้ายของต้นไม้ไบนารีที่กำหนดใน C++

ผลลัพธ์:

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