Leetcode 1367. Linked List in Binary Tree (二叉树好题)

  1. Linked List in Binary Tree
    Medium
    Given a binary tree root and a linked list with head as the first node.

Return True if all the elements in the linked list starting from the head correspond to some downward path connected in the binary tree otherwise return False.

In this context downward path means a path that starts at some node and goes downwards.

Example 1:

Input: head = [4,2,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]

Output: true

Explanation: Nodes in blue form a subpath in the binary Tree.

Example 2:

Input: head = [1,4,2,6], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]

Output: true

Example 3:

Input: head = [1,4,2,6,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]

Output: false

Explanation: There is no path in the binary tree that contains all the elements of the linked list from head.

Constraints:

The number of nodes in the tree will be in the range [1, 2500].

The number of nodes in the list will be in the range [1, 100].

1 <= Node.val <= 100 for each node in the linked list and binary tree.

解法1:

这题其实并不容易。要在整个二叉树里面,对每个节点调用helper()函数,用前中后序遍历应该都可以。helper()则是用的分解问题的方法。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
/**
 * 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 isSubPath(ListNode* head, TreeNode* root) {
        if (!head) return true;
        if (!root) return false;
        if (helper(head, root)) return true;
        return isSubPath(head, root->left) || isSubPath(head, root->right);  
    }
private:
    bool helper(ListNode* head, TreeNode* root) {
        if (!head) return true;
        if (!root) return false;
        if (head->val != root->val) return false;
        return helper(head->next, root->left) || helper(head->next, root->right);
    }
};

我一开始写成下面这样,但是不对。因为它只调用了一次helper(),如果链表是{2,2,1},而树里面存在一个path{2,2,2,1},结果应该返回true。但这个解法里面,读到第3个2的时候,发现不对,已经没法走回头路了。
应该在整个树里面,对每个节点都调用helper(),用前/中/后序遍历都可以。

cpp 复制代码
class Solution {
public:
    bool isSubPath(ListNode* head, TreeNode* root) {
        origHead = head;
        origRoot = root;
        helper(head, root);
        return gPathExist;
    }
private:
    bool gPathExist = false;
    TreeNode *origRoot = NULL;
    ListNode *origHead = NULL;
    void helper(ListNode *head, TreeNode *root) {
        if (!head) {
            gPathExist = true;
            return;
        }
        if (!root || gPathExist) return;
        if (root->val == head->val) {
            helper(head->next, root->left);
            helper(head->next, root->right);
        } else {
            if (root == origRoot) {
                helper(origHead, root->left);
                helper(origHead, root->right);
            } else if (head != origHead) {
                helper(origHead, root);
                helper(origHead, root);
            }
        }
    }
};
相关推荐
爱吃涮毛肚的肥肥(暂时吃不了版)2 分钟前
项目班——0510——JSON网络封装
c++·算法·json
liang_202616 分钟前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结
緈福的街口17 分钟前
【leetcode】2900. 最长相邻不相等子序列 I
算法·leetcode·职场和发展
易只轻松熊18 分钟前
C++(20): 文件输入输出库 —— <fstream>
开发语言·c++·算法
远瞻。39 分钟前
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理
论文阅读·算法
进击的小白菜44 分钟前
LeetCode 153. 寻找旋转排序数组中的最小值:二分查找法详解及高频疑问解析
数据结构·算法·leetcode
dog2501 小时前
BBR 的 buffer 动力学观感
人工智能·算法
supingemail3 小时前
面试之 Java 新特性 一览表
java·面试·职场和发展
冲帕Chompa4 小时前
图论part10 bellman_ford算法
数据结构·算法·图论
緈福的街口4 小时前
【leetcode】144. 二叉树的前序遍历
算法·leetcode