1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * public int val;
  5. * public TreeNode left;
  6. * public TreeNode right;
  7. * public TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11. private string generatepreorderString(TreeNode s)
  12. {
  13. StringBuilder sb = new StringBuilder();
  14. Stack<TreeNode> stacktree = new Stack<TreeNode>();
  15. stacktree.Push(s);
  16. while (stacktree.Count > )
  17. {
  18. TreeNode popelem = stacktree.Pop();
  19. if (popelem == null)
  20. {
  21. sb.Append(",#"); // Appending # inorder to handle same values but not subtree cases
  22. }
  23. else
  24. {
  25. sb.Append("," + popelem.val);
  26. }
  27. if (popelem != null)
  28. {
  29. stacktree.Push(popelem.right);
  30. stacktree.Push(popelem.left);
  31. }
  32. }
  33. return sb.ToString();
  34. }
  35.  
  36. public bool IsSubtree(TreeNode s, TreeNode t)
  37. {
  38. string spreorder = generatepreorderString(s);
  39. string tpreorder = generatepreorderString(t);
  40.  
  41. return spreorder.Contains(tpreorder);
  42. }
  43. }

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

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

  1. class Solution:
  2. s_pre = ""
  3. t_pre = ""
  4. def preOrder(self,root):
  5. if root!=None:
  6. self.s_pre += '<'+ str(root.val) + '>'
  7. self.preOrder(root.left)
  8. self.preOrder(root.right)
  9. else:
  10. self.s_pre += '<x>'
  11.  
  12. def preOrder2(self,root):
  13. if root!=None:
  14. self.t_pre += '<' + str(root.val) + '>'
  15. self.preOrder2(root.left)
  16. self.preOrder2(root.right)
  17. else:
  18. self.t_pre += '<x>'
  19.  
  20. def isSubtree(self, s: 'TreeNode', t: 'TreeNode') -> 'bool':
  21. self.preOrder(s)
  22. self.preOrder2(t)
  23. return self.t_pre in self.s_pre

执行效率还是比较高的。

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

  1. class Solution:
  2. def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
  3. if s == None:
  4. return False
  5. return self.isSubTreeWithRoot(s,t) or self.isSubtree(s.left,t) or self.isSubtree(s.right,t)
  6.  
  7. def isSubTreeWithRoot(self,s,t):
  8. if s == None and t == None:
  9. return True
  10. if s == None or t == None:
  11. return False
  12. if s.val != t.val:
  13. return False
  14. 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. 21天学通C++_Day5

    昨天停更了一天,真是羞羞啊,不过还是干了很多有意义的事的! 首先,昨天下午的时候,去参加了学校的春招!第一次参加招聘会,怕自己答不上面试官的问题,很是紧张! 和同学约的一点,结果到了发现还没开始,只能 ...

  2. JAVA类的加载、连接与初始化

    JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...

  3. Oracle数据库安装图文操作步骤1

    Oracle数据库安装图文操作步骤 一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符.   官 ...

  4. db_recovery_file_dest_size 修改大一点及删除归档日志 |转|

    今天给客户测 试问题,让客户把数据发过来了.解压缩后一看,他们还是用的oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本 ...

  5. VirtulBox安装虚拟机(鼠标点击时)0x00000000指令引用的0x00000000内存该内存不能为written错误解决方案

    这个错误并不是所有人都会用到,我用的是WIN7系统,公司的电脑.查找了很多原因后,发现的确是由于系统主题被破解过的原因. 手工恢复风险太高.通过下面的工具就可以直接恢复.UniversalThemeP ...

  6. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  7. Sublime + python2.7 + opencv (轻量级开发环境)

    工具: 1. Python2.7,安装完成 2. 相应版本的cv2.pyd,放入到…\Python27\Lib\site-packages\下 3. 下载Sublime Text 3,破解它,网上搜个 ...

  8. 生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

    全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; st ...

  9. 如何搭建struts2框架

    一.首先,下载5个Struts2核心jar包: commons-logging-1.1.1.jar freemarker-2.3.15.jar ognl-2.7.3.jar struts2-core- ...

  10. 运维平台cmdb开发-day3

    后台管理 1. 访问过程 我们在前面2天得到了各个客户端的资产数据信息,我们将各个这个数据打包发送到api,这个api其实就是django的url传参,之后按照数据的格式对比数据库增删改 2. 后台页 ...