剑指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

posted @ 2019-02-24 14:13  大胖子球花  阅读(123)  评论(0)    收藏  举报