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

โปรแกรมหาระดับของต้นไม้ที่มีผลรวมน้อยที่สุดใน C++


สมมติว่าเรามีต้นไม้ไบนารี ระดับของรูทคือ 1 ระดับของลูกคือ 2 และเพิ่มขึ้นไปเรื่อยๆ เราต้องหาระดับ X ที่เล็กที่สุดที่ทำให้ผลรวมของค่าโหนดทั้งหมดในระดับ X นั้นน้อยที่สุด

เช่น ต้นไม้ที่มีโครงสร้างดังภาพ ผลลัพธ์จะเป็น 2 เนื่องจากผลรวมระดับ 2 คือ 4 + (-10) = -6 ซึ่งน้อยที่สุด

ขั้นตอนการแก้ปัญหา

  • เริ่มต้น level = 1, sum = ค่าของรูท, ansLevel = level, ansSum = sum
  • ใช้คิว (queue) สำหรับ BFS ใส่รูทเข้าไป
  • วนลูปจนคิวว่าง:
    • capacity = ขนาดคิว (จำนวนโหนดในระดับปัจจุบัน)
    • เพิ่ม level, ตั้ง sum = 0
    • วนลูป capacity ครั้ง:
      • นำโหนดหน้าคิวออก (pop)
      • ถ้ามีลูกขวา: บวกค่าลูกขวาเข้า sum, ใส่ลูกขวาเข้าคิว
      • ถ้ามีลูกซ้าย: บวกค่าลูกซ้ายเข้า sum, ใส่ลูกซ้ายเข้าคิว
    • ถ้า sum < ansSum: อัปเดต ansSum และ ansLevel
  • คืนค่า ansLevel

ตัวอย่างโค้ด

#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 solve(TreeNode* r) {
        int level = 1, sum = r->val;
        int ansLevel = level, ansSum = sum;
        queue<TreeNode*> q;
        q.push(r);
        while (!q.empty()) {
            int capacity = q.size();
            level++;
            sum = 0;
            while (capacity--) {
                TreeNode* node = q.front();
                q.pop();
                if (node->right) {
                    sum += node->right->val;
                    q.push(node->right);
                }
                if (node->left) {
                    sum += node->left->val;
                    q.push(node->left);
                }
            }
            if (ansSum > sum) {
                ansSum = sum;
                ansLevel = level;
            }
        }
        return ansLevel;
    }
};

int main() {
    TreeNode *root = new TreeNode(5);
    root->left = new TreeNode(4);
    root->right = new TreeNode(-10);
    root->left->right = new TreeNode(-2);
    root->right->left = new TreeNode(-7);
    root->right->right = new TreeNode(15);
    Solution ob;
    cout << ob.solve(root);
}

อินพุต

TreeNode *root = new TreeNode(5); root->left = new TreeNode(4); root->right = new TreeNode(-10); root->left->right = new TreeNode(-2); root->right->left = new TreeNode(-7); root->right->right = new TreeNode(15);

เอาต์พุต

2