剑指offer26 树的子结构
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1==null||root2==null) return false; boolean ans = false; if(root1.val==root2.val) ans = isTree2Subtree(root1,root2); if(!ans) ans=HasSubtree(root1.left,root2); if(!ans) ans=HasSubtree(root1.right,root2); return ans; } private boolean isTree2Subtree(TreeNode root1,TreeNode root2){ if(root2==null) return true; if(root1==null) return false; return (root1.val==root2.val)&&isTree2Subtree(root1.left,root2.left)&&isTree2Subtree(root1.right,root2.right); } }
运行时间:16ms
占用内存:9548k
这题没做过的话还是挺难的,做过的话其实思路很简单,就是先对tree1进行遍历,寻找与root2.val相等的节点。然后以root2为根节点开始遍历,对比tree2是否是tree1的子结构。
其实很简单。
这里还有个坑,如果树里的val是double或者float的话,注意不能直接用==。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def HasSubtree(self, pRoot1, pRoot2): # write code here if pRoot2 is None or pRoot1 is None: return False ans = pRoot1.val==pRoot2.val if ans: ans = self.isSubtree(pRoot1,pRoot2) if not ans: ans = self.HasSubtree(pRoot1.left,pRoot2) if not ans: ans = self.HasSubtree(pRoot1.right,pRoot2) return ans def isSubtree(self, pRoot1, pRoot2): if pRoot2==None: return True if pRoot1==None:#and pRoot2!=null return False if pRoot1.val!=pRoot2.val: return False return self.isSubtree(pRoot1.left,pRoot2.left) and self.isSubtree(pRoot1.right,pRoot2.right)
运行时间:26ms
占用内存:5856k

浙公网安备 33010602011771号