我在做一个Leetcode问题subtree-of-another-tree。总结了2种不同类型的算法here。你知道吗
“naiveapproach”的运行时间在Python中约为250ms,在Java中为0~5ms。然而,在Python中,据说更有效的“高级方法”的运行时间约为88ms,在Java中为10ms。你知道吗
为什么高级方法在Java中运行较慢?你知道吗
以下是我用来测试的代码:
天真的方法:
Python:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
if s is None and t is None:
return True
elif s is None or t is None:
return False
else:
if s.val == t.val:
left = self.isSame(s.left, t.left)
right = self.isSame(s.right, t.right)
if left and right:
return True
else:
left = self.isSubtree(s.left, t)
right = self.isSubtree(s.right, t)
return left or right
else:
left = self.isSubtree(s.left, t)
right = self.isSubtree(s.right, t)
return left or right
def isSame(self, s, t):
if s is None and t is None:
return True
elif s is not None and t is not None:
if s.val == t.val:
left = self.isSame(s.left, t.left)
right = self.isSame(s.right, t.right)
return left and right
else:
return False
else:
return False
爪哇语:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode headT;
public boolean isSubtree(TreeNode s, TreeNode t) {
headT = t;
return isSame(s, headT);
}
public boolean isSame(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val == t.val) {
return (isSame(s.left, t.left) && isSame(s.right, t.right)) || isSame(s.left, t) || isSame(s.right, t);
}
return isSame(s.left, headT) || isSame(s.right, headT);
}
}
高级方法:
Python:
class Solution(object):
def isSubtree(self, s, t):
"""
:type s: TreeNode
:type t: TreeNode
:rtype: bool
"""
def convert(p):
return "^" + str(p.val) + "#" + convert(p.left) + convert(p.right) if p else "$"
return convert(t) in convert(s)
爪哇
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
String ss = convert(s);
String tt = convert(t);
return ss.contains(tt);
}
public String convert(TreeNode s){
if (s==null){
return "#";
}else{
return "^" + Integer.toString(s.val) + convert(s.left) + convert(s.right);
}
}
}
目前没有回答
相关问题 更多 >
编程相关推荐