LEETCODE 1367. Linked List in Binary Tree 解题思路分析

题目大意:

二叉树中的列表

给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。

如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。

一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。

示例 1:

输入:head = [4,2,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:true
解释:树中蓝色的节点构成了与链表对应的子路径。

示例 2:

输入:head = [1,4,2,6], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:true

示例 3:

输入:head = [1,4,2,6,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
输出:false
解释:二叉树中不存在一一对应链表的路径。

提示:

  • 二叉树和链表中的每个节点的值都满足 1 <= node.val <= 100 。
  • 链表包含的节点数目在 1 到 100 之间。
  • 二叉树包含的节点数目在 1 到 2500 之间。

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1367

解题思路分析:

遇到二叉树和链表题目时,使用dfs或者说递归来解题是最为高效的方式。本题我们需要dfs二叉树上的每一个节点,然后以当前节点为起点查看是否能找到与链表完全相同的路径。与链表进行比对时,同样需要使用到dfs递归操作。如果二叉树当前节点与链表当前节点不相同,那么说明无法找到匹配的路径,返回false。如果相同,我们查看二叉树的右子节点是否为空,如果不为空,dfs递归至二叉树右子节点与链表下一节点。同理,我们还可以dfs递归至二叉树左子节点以及链表下一节点。两条线路只要有一条返回true即可。递归的终止条件为当链表的下一节点为null时,返回true。

实现代码:

public boolean isSubPath(ListNode head, TreeNode root) {
    // dfs求解
    return dfs(head,root);
}

boolean dfs(ListNode head, TreeNode root){
    // 查看以当前root节点为起点,是否能找到与链表完全一致的路径。
    // 如果能找到,返回true。
    if(check(head, root)) return true;
    // 如果当前节点找不到与链表相同的路径,
    // dfs递归至左子节点,如果能找到,返回true。
    if(root.left!=null&&dfs(head, root.left)) return true;
    // 若还不能找到,dfs递归至右子节点,如果能找到,返回true。
    if(root.right!=null&&dfs(head, root.right)) return true;
    // 若还不能找到,返回false。
    return false;
}
// 查看以二叉树当前节点为起点,是否能找到与链表相同的路径
boolean check(ListNode head, TreeNode root){
    // 如果链表当前节点等于二叉树当前节点
    if(head.val==root.val){
        // 若链表不存在下一节点,说明链表已经遍历结束,返回true
        if(head.next==null) return true;
        // 如果链表还有下一节点,并且二叉树存在左子节点,
        // 利用链表的下一节和二叉树的左子节点继续递归
        if(root.left!=null&&check(head.next, root.left)) return true;
        // 如果链表还有下一节点,并且二叉树存在右子节点,
        // 利用链表的下一节和二叉树的右子节点继续递归
        if(root.right!=null&&check(head.next, root.right)) return true;
    }
    return false;
}

本题解法执行时间为1ms。

Runtime: 1 ms, faster than 99.73% of Java online submissions for Linked List in Binary Tree.

Memory Usage: 41.7 MB, less than 100.00% of Java online submissions for Linked List in Binary Tree.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1367-linked-list-in-binary-tree-解题思路分析/
此条目发表在leetcode分类目录,贴了, , , , , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。