zoukankan      html  css  js  c++  java
  • leetcode572

    /**
     * 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 > 0)
                {
                    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的字串。

     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)

  • 相关阅读:
    Using System Partitioning
    startup命令
    [转]Oracle 10g/11g 密码策略 用户口令 大小写敏感
    [转]Oracle DB 加强的数据安全管理
    Scheduling Jobs with Oracle Scheduler
    [转]Oracle DB SQL 计划管理
    Performing Time-Based or Change-Based Incomplete Recovery
    闪回数据归档
    Managing Optimizer Statistics
    性能测试--十个命令迅速发现性能问题
  • 原文地址:https://www.cnblogs.com/asenyang/p/6830122.html
Copyright © 2011-2022 走看看