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

นับโหนดต้นไม้สมบูรณ์ (Complete Tree Nodes) ใน C++


สมมติว่าเรามีต้นไม้ไบนารีสมบูรณ์ เราต้องนับจำนวนโหนด ดังนั้นถ้าต้นไม้เป็นแบบ -

นับโหนดต้นไม้สมบูรณ์ (Complete Tree Nodes) ใน C++

ผลลัพธ์จะเป็น 6

ในการแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้

  • นี่จะใช้วิธี Recursive เมธอด countNodes() รับ root เป็นอาร์กิวเมนต์
  • hr := 0 และ hl := 0
  • สร้างโหนด l และ r เป็น root
  • while l ไม่ว่างเปล่า
    • เพิ่ม hl ขึ้น 1
    • l := left ของ l
  • while r ไม่ว่างเปล่า
    • r := right ของ r
    • เพิ่ม hr ขึ้น 1
  • ถ้า hl = hr แล้ว return (2 ^ hl) - 1
  • return 1 + countNodes(left ของ root) + countNodes(right ของ root)

ลองดูการนำไปใช้ต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

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

#include <bits/stdc++.h>
using namespace std;

class TreeNode{
public:
    int val;
    TreeNode *left, *right;
    TreeNode(int data){
        val = data;
        left = 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;
}

class Solution {
public:
    int fastPow(int base, int power){
        int res = 1;
        while(power > 0){
            if(power & 1) res *= base;
            base *= base;
            power >>= 1;
        }
        return res;
    }
    
    int countNodes(TreeNode* root) {
        int hr = 0;
        int hl = 0;
        TreeNode* l = root;
        TreeNode* r = root;
        while(l){
            hl++;
            l = l->left;
        }
        while(r){
            r = r->right;
            hr++;
        }
        if(hl == hr) return fastPow(2, hl) - 1;
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};

main(){
    Solution ob;
    vector<int> v = {1,2,3,4,5,6,7,8,9,10};
    TreeNode *node = make_tree(v);
    cout << (ob.countNodes(node));
}

อินพุต

[1,2,3,4,5,6,7,8,9,10]

เอาต์พุต

10