【问题标题】:Wrong Answer on Leetcode for Leaf Similar Trees Problem done by BFSBFS 对 Leetcode 的叶子相似树问题的错误答案
【发布时间】: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


【解决方案1】:

我尝试在示例 1 上干运行您的代码。

v1 的内容:6,9,8,7,4

其中作为 v2 的内容:6,7,4,9,8

由于您正在执行 BFS 遍历,因此较低深度的叶节点将首先被推入结果向量,而不是较高深度的叶节点。所以它不会保持从左到右的顺序。

要保持从左到右的顺序,您应该使用 DFS 遍历,尝试使用树的有序遍历。

【讨论】:

  • 感谢您的建议,我可能会使用 DFS 来解决这些问题!
  • 如果您的问题得到解答,您可以考虑接受答案。
  • 谢谢,我是 Stackoverflow 的新手,因此不知道有这样的功能。我现在已经接受了答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2021-09-19
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多