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ư
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