algorithm - 二叉树中的链表
问题描述
我正在尝试解决:https ://leetcode.com/contest/weekly-contest-178/problems/linked-list-in-binary-tree/
我有以下解决方案:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
boolean ans;
ListNode originalHead;
public boolean isSubPath(ListNode head, TreeNode root) {
this.ans = false;
originalHead = head;
traverse(head, root);
return ans;
}
public void traverse(ListNode head, TreeNode root) {
if(head == null) {
ans = true;
return;
}
if(root == null) return;
if(!ans && root.val == head.val) traverse(head.next, root.right);
if(!ans && root.val == head.val) traverse(head.next, root.left);
if(!ans) traverse(originalHead, root.right);
if(!ans) traverse(originalHead, root.left);
}
}
我想知道这个解决方案的时间复杂度是否为 O(n^2)。我之所以问这个问题,是因为我在测试套件中的一个测试用例中遇到了 Time Limit Exceeded 错误。
我确实看到其他 O(n^2) 解决方案通过了。
感谢任何帮助。
谢谢!
解决方案
如果n是树中的顶点数,那么您的算法的最坏情况时间复杂度是 Θ(2 n ) 而不是O ( n 2 )。
这种最坏的情况发生在树的每个非叶子节点只有一个孩子,链表的长度大于树的深度,并且树和链表中的所有节点都具有相同的值时。当这种情况发生时,你最终会进行所有的递归调用——你的if
-conditions 总是得到满足——所以每次你调用traverse
一个节点时,你都会在它的子节点上调用traverse
两次。因此,您traverse
在根节点上调用一次,在其子节点上调用两次,对其孙子调用四次,对其曾孙调用八次,依此类推,如果有n 个节点,则为 Θ(2 n )。
推荐阅读
- python-3.x - 从 py 文件生成 exe 后的问题
- android - 在cmd中签署apk ionic android的问题
- python-3.x - 数组的词干和词形还原
- sql - 等效查询产生不同的结果
- r - 如何在 ggplot 中编辑图例描述而不获得第二个图例?
- javascript - 使用cheerio处理HTML文件时如何防止HTML文件格式更改
- c# - 如何在 C# 中更新 List<(T, T, T)>
- php - 任何人都可以帮助我我的代码 php 有什么问题
- python-3.7 - 在 Python 中使用换行符读取文件
- android - 用xml在两边做一个箭头形状