Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm số cây con không có giá trị trong C ++

Giả sử chúng ta có một cây nhị phân; chúng ta phải đếm số lượng cây con đơn giá trị. Ở đây, cây con Uni-value cho biết tất cả các nút của cây con có cùng giá trị.

Vì vậy, nếu đầu vào là root =[5,1,5,5,5, null, 5],

Đếm số cây con không có giá trị trong C ++

thì đầu ra sẽ là 4

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm giải quyết (), điều này sẽ lấy nút,

  • nếu nút trống, thì -

    • trả về true

  • left:=giải quyết (bên trái của nút)

  • phải:=giải quyết (bên phải của nút)

  • nếu bên trái là sai hoặc bên phải là sai, thì -

    • trả về false

  • nếu bên trái của nút có mặt và giá trị của nút không bằng giá trị của bên trái của nút, thì -

    • trả về false

  • nếu bên phải của nút có mặt và giá trị của nút không bằng giá trị của bên phải của nút, thì -

    • trả về false

  • (tăng ret lên 1)

  • trả về true

  • Từ phương thức chính, hãy làm như sau -

  • ret:=0

  • giải quyết (root)

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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;
}
class Solution {
public:
   int ret;
   bool solve(TreeNode* node){
      if (!node || node->val == 0)
         return true;
      bool left = solve(node->left);
      bool right = solve(node->right);
      if (!left || !right)
         return false;
      if (node->left && node->left->val != 0 && node->val != node->left->val)
         return false;
      if (node->right && node->right->val != 0 && node->val != node->right->val)
         return false;
      ret++;
      return true;
   }
   int countUnivalSubtrees(TreeNode* root){
      ret = 0;
      solve(root);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int< v = {5,1,5,5,5,NULL,5};
   TreeNode *root = make_tree(v);
   cout << (ob.countUnivalSubtrees(root));
}

Đầu vào

{5,1,5,5,5,NULL,5}

Đầu ra

4