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

Độ sâu tối thiểu của cây nhị phân trong C ++

Giả sử chúng ta có một cây nhị phân; chúng ta phải tìm độ sâu tối thiểu của cây đó. Như chúng ta biết, độ sâu tối thiểu là số nút dọc theo đường đi ngắn nhất từ ​​nút gốc xuống đến nút lá gần nhất.

Vì vậy, nếu đầu vào giống như

Độ sâu tối thiểu của cây nhị phân trong C ++

thì đầu ra sẽ là 2

Để 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 mảng aa của các nút cây

  • chèn root vào cuối aa

  • Xác định một mảng khác của các nút cây

  • cấp:=0

  • nếu root là null, thì -

    • trả về 0

  • trong khi kích thước của aa không bằng 0, do -

    • xóa mảng ak

    • (tăng cấp 1)

    • cho tất cả nút a trong aa -

      • nếu (bên trái của a là null) và (bên phải của a là null), thì -

        • mức trả lại

        • Ra khỏi vòng lặp

      • nếu bên trái của a không rỗng, thì -

        • chèn bên trái của a vào cuối ak

      • nếu quyền của a không rỗng, thì -

        • chèn bên phải của a vào cuối ak

    • aa:=ak

  • trả về 0

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 minDepth(TreeNode* root) {
      vector<TreeNode*> aa;
      aa.push_back(root);
      vector<TreeNode*> ak;
      int level = 0;
      if (root == NULL || root->val == 0) {
         return 0;
      }
      while (aa.size() != 0) {
         ak.clear();
         level++;
         for (TreeNode* a : aa) {
            if ((a->left == NULL || a->left->val == 0)&& (a->right == NULL || a->right->val == 0)) {
               return level;
               break;
            }
            if (a->left != NULL) {
               ak.push_back(a->left);
            }
            if (a->right != NULL) {
               ak.push_back(a->right);
            }
         }
         aa = ak;
      }
      return 0;
   }
};
main(){
   Solution ob;
   vector<int&g; v = {3,9,20,NULL,NULL,15,7};
   TreeNode *root = make_tree(v);
   cout << (ob.minDepth(root));
}

Đầu vào

{3,9,20,NULL,NULL,15,7}

Đầu ra

2