Leetcode1367. 二叉树中的列(链)表 回溯递归 递归叠加


Leetcode链接: https://leetcode-cn.com/problems/linked-list-in-binary-tree/
Leetcode1367. 二叉树中的列(链)表 回溯递归 递归叠加_第1张图片Leetcode1367. 二叉树中的列(链)表 回溯递归 递归叠加_第2张图片Leetcode1367. 二叉树中的列(链)表 回溯递归 递归叠加_第3张图片Leetcode1367. 二叉树中的列(链)表 回溯递归 递归叠加_第4张图片

本题在进行递归的时候涉及到两层递归,不仅递归函数需要进行递归,主函数也需要递归…在初见的时候试图直接主函数调dfs然后dfs全部处理完毕输出,然后TLE和WA了好多次…(最后测试数据里有个超大的树里边只有NULL和1…)

正确思路:主函数对树的节点递归求解,dfs对匹配进行递归求解

正解:

class Solution {
     
public:
    bool dfs(TreeNode* root, ListNode* head)
    {
     
        if(head == NULL)
            return true;
        if(root == NULL)
            return false;
        if(root->val != head->val)
            return false;

        return dfs(root->left,head->next)||dfs(root->right,head->next);

    }
    
    bool isSubPath(ListNode* head, TreeNode* root) {
     
        if(root==NULL)
            return false;
        return dfs(root,head)||isSubPath(head, root->left)||isSubPath(head, root->right);
        
    }
};

错误解法: (太傻了太傻了…)

class Solution {
     
public:
    int deep;
    vector<int> valVec;
    bool found = false;
    void dfs(TreeNode* root, int position)
    {
     
        if(found == true)
            return;
        if(root->val == valVec[position])
        {
     
            if(position == deep)
            {
     
                found = true;
                return;
            }
            else{
     
                if(root->left != NULL)
                    dfs(root->left,position+1);
                if(root->right != NULL)
                    dfs(root->right,position+1);
            }
        }

            if(root->left != NULL)
            {
     
                if(root->left->val == valVec[position] && deep!=0)
                    dfs(root->left,1);
                else
                    dfs(root->left,0);
            }
            if(root->right != NULL)
            {
     
                if(root->right->val == valVec[position]&& deep!=0)
                    dfs(root->right,1);
                else
                    dfs(root->right,0);
            }
        
        
    }
    
    
    
    
    bool isSubPath(ListNode* head, TreeNode* root) {
     
        while(head!=NULL)
        {
     
            valVec.push_back(head->val);
            head = head->next;
        }
        deep = valVec.size()-1;
        int counter = 0;
        while(valVec[counter]==1)
            counter++;
        if(counter == valVec.size())
            return false;
        dfs(root,0);
        return found;
        
    }
};

你可能感兴趣的:(杂七杂八的题,dfs,leetcode,算法)