【发布时间】:2021-09-29 02:03:42
【问题描述】:
我正在尝试使用广度优先搜索来解决给定的问题(我知道深度优先搜索最适合这种情况,但我只是想尝试一下)
我的代码似乎在其他测试用例的情况下工作,但在第一个测试用例的情况下失败。 请对我的代码提出一些改进建议。
问题链接 - https://leetcode.com/problems/leaf-similar-trees/
我的代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool leafSimilar(TreeNode* root1, TreeNode* root2) {
vector<int> v1, v2;
queue<TreeNode*> q1;
queue<TreeNode*> q2;
//Applying BFS for first tree
q1.push(root1);
while(!q1.empty())
{
int size = q1.size();
for(int i=0;i<size;i++)
{
TreeNode* curr = q1.front();
q1.pop();
if(curr->left != NULL)
q1.push(curr->left);
if(curr->right != NULL)
q1.push(curr->right);
if(curr->left == NULL && curr->right == NULL)
v1.push_back(curr->val);
}
}
//Applying BFS for second tree
q2.push(root2);
while(!q2.empty())
{
int size = q2.size();
for(int i=0;i<size;i++)
{
TreeNode* curr = q2.front();
q2.pop();
if(curr->left != NULL)
q2.push(curr->left);
if(curr->right != NULL)
q2.push(curr->right);
if(curr->left == NULL && curr->right == NULL)
v2.push_back(curr->val);
}
}
if(v1.size() != v2.size())
return false;
for(int i=0;i<v1.size();i++)
{
if(v1[i] != v2[i])
return false;
}
return true;
}
};
【问题讨论】:
-
你能做的最好的事情是获得第一个测试用例,在调试器中运行程序,输入测试用例,并逐步执行函数,注意意外情况(比如取错路径或存储错误的值)。那将是一个错误。或者不好的期望。要么不好,需要修复。
-
旁注:对于第一个测试用例,我可能会做一些愚蠢的事情,比如在一个空的测试用例中输入。如果代码无法处理任何数据,那是测试周期的一个非常快速的周转。
-
广度优先搜索在站点的第一张图片中显示的树中以 6、9、8、7、4 的顺序查找叶子。顺便说一句:如果您基本上多次重复相同的逻辑,只是替换了一些变量,您应该考虑使用一个函数。在您的情况下,您对两棵树重复完全相同的逻辑两次。
-
深度优先搜索从左到右(或从右到左)访问叶子,而不考虑深度。广度优先搜索从上到下访问它们,因此您最后访问最深的叶子。因此,如果两棵树的叶子在不同的深度,广度优先会给你错误的答案。
-
“我知道深度优先搜索最适合这种情况,但我只是想尝试一下”:那么您还应该考虑有时您必须放弃提出一个想法并得出结论认为这是一个糟糕的想法。 BFS 对于解决这个问题根本没有帮助。
标签: c++ algorithm data-structures binary-tree breadth-first-search