/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private string generatepreorderString(TreeNode s)
{
StringBuilder sb = new StringBuilder();
Stack<TreeNode> stacktree = new Stack<TreeNode>();
stacktree.Push(s);
while (stacktree.Count > )
{
TreeNode popelem = stacktree.Pop();
if (popelem == null)
{
sb.Append(",#"); // Appending # inorder to handle same values but not subtree cases
}
else
{
sb.Append("," + popelem.val);
}
if (popelem != null)
{
stacktree.Push(popelem.right);
stacktree.Push(popelem.left);
}
}
return sb.ToString();
} public bool IsSubtree(TreeNode s, TreeNode t)
{
string spreorder = generatepreorderString(s);
string tpreorder = generatepreorderString(t); return spreorder.Contains(tpreorder);
}
}

https://leetcode.com/problems/subtree-of-another-tree/#/description

补充一个使用python的实现,思路就是使用二叉树的先序遍历,将节点和空节点存储到字符串中,然后比较t是否是s的字串。

 class Solution:
s_pre = ""
t_pre = ""
def preOrder(self,root):
if root!=None:
self.s_pre += '<'+ str(root.val) + '>'
self.preOrder(root.left)
self.preOrder(root.right)
else:
self.s_pre += '<x>' def preOrder2(self,root):
if root!=None:
self.t_pre += '<' + str(root.val) + '>'
self.preOrder2(root.left)
self.preOrder2(root.right)
else:
self.t_pre += '<x>' def isSubtree(self, s: 'TreeNode', t: 'TreeNode') -> 'bool':
self.preOrder(s)
self.preOrder2(t)
return self.t_pre in self.s_pre

执行效率还是比较高的。

再补充一个双层递归的实现,我是不喜欢这种方式的,而且执行效率也低。

 class Solution:
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
if s == None:
return False
return self.isSubTreeWithRoot(s,t) or self.isSubtree(s.left,t) or self.isSubtree(s.right,t) def isSubTreeWithRoot(self,s,t):
if s == None and t == None:
return True
if s == None or t == None:
return False
if s.val != t.val:
return False
return self.isSubTreeWithRoot(s.left,t.left) and self.isSubTreeWithRoot(s.right,t.right)

leetcode572的更多相关文章

  1. 第26题:LeetCode572:Subtree of Another Tree另一个树的子树

    题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: ...

  2. [Swift]LeetCode572. 另一个树的子树 | Subtree of Another Tree

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  3. Leetcode--572. Subtree of Another Tree(easy)

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  4. Leetcode572.Subtree of Another Tree另一个树的子树

    给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定的树 ...

  5. LeetCode572. 另一个树的子树

    题目 本题目一开始想要通过二叉树遍历KMP匹配,但看来实现比较复杂 不如直接暴力匹配,本题和LeetCode100.相同的树有共通之处 1 class Solution { 2 public: 3 b ...

  6. leetcode_二叉树篇_python

    主要是深度遍历和层序遍历的递归和迭代写法. 另外注意:因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中). 所有题目首先考虑root否是空.有的 ...

随机推荐

  1. 【集成学习】 lightgbm原理

    # lightgbm和xgboost对比: 模型精度:lightgbm≈xgboost 收敛速度:lightgbm>xgboost #

  2. java中守护线程的一些概念和用法

    网上的资料中,守护线程的功能一般都是“只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用是为其他线 ...

  3. Luogu3387 缩点 【tarjan】【DP】

    Luogu3387 缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...

  4. 在liunx系统安装负载生成器(Load Generator)

    #初始化系统 yum -y update yum -y install ntpdate ntpdate asia.pool.ntp.org yum -y install wget make cmake ...

  5. IIS并发瓶颈线程数的限制

    .NET线程池最大线程数的限制-记一次IIS并发瓶颈 https://www.cnblogs.com/7rhythm/p/9964543.html .NET ThreadPool 最大线程数的限制 I ...

  6. Oracle数据库安装完成后相关问题的解决

    笔者一直以来都是使用公司服务器上的oracle数据库,突然一天公司服务器宕机了,项目无法访问数据库跟着瘫痪了,所以准备在自己的机器上安装一个oracle数据库. 从官网下载安装了oracle 11g后 ...

  7. 开启opcache提高性能

    在开启opcache之前,我们先介绍一下编译与解释: 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快:而解释器则是只在执行程 ...

  8. 洛谷 P1022 计算器的改良

    题解:字符串模拟 坑点: 1) 0/-1=-0. 这是因为(来自洛谷讨论区某大犇) double下存储的数字会有精度误差,比如0可能被存成0.000000000...01然而如果你乘上或者除以一个负数 ...

  9. np.random的随机数函数

    np.random的随机数函数(1) 函数 说明 rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数, [0,1),均匀分布 randn(d0,d1,..,dn) 根据d0‐dn ...

  10. 3.JMeter添加集合点

    1.JMeter的集合点是通过添加定时器来完成的,在做性能测试时,真正的并发是不可能的,为了更真实的模拟并发场景,因此在需要压测的地方设置集合点,即可一起操作发送请求. 2.JMeter添加定时器,右 ...