剑指Offer面试题18 & Leetcode572

来源:互联网 发布:qq mac版是什么 编辑:程序博客网 时间:2024/06/08 07:09

剑指Offer面试题18 & Leetcode572

Subtree of Another Tree  树的子结构

Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node’s descendants. The tree s could also be considered as a subtree of itself.

解题思路

  考虑:首先寻找s树中与t树头结点值相同的节点,可以用递归实现。找到相同的节点后,比较该节点为头的节点和t树是否完全相同,这个过程也可以用递归完成。剑指Offer上此题与leetcode572题有一些不同之处:前者的子树为只要包含这个树就可以,而后者必须是t树与s树对应节点的所有后代都相同。所以前者递归结束的条件是只要t树的指针指向null即可,而后者必须两个指针全部指向null。

Solution1 剑指Offer

public boolean isSubtree(TreeNode s, TreeNode t) {        if(s!=null && t!=null){            if(s.val  == t.val){                if(helper(s,t))                    return true;            }            return isSubtree(s.left, t) || isSubtree(s.right, t);        }        return false;    }    boolean helper(TreeNode s, TreeNode t) {        if(t == null)            return true;        if(s == null)            return false;        if(t.val != s.val)            return false;        return helper(s.left, t.left) && helper(s.right, t.right);    }

Solution2 Leetcode572

public boolean isSubtree(TreeNode s, TreeNode t) {        if(s!=null && t!=null){            if(s.val  == t.val){                if(helper(s,t))                    return true;            }            return isSubtree(s.left, t) || isSubtree(s.right, t);        }        return false;    }    boolean helper(TreeNode s, TreeNode t) {        if(t == null && s == null)            return true;        if(s == null || t == null)            return false;        if(t.val != s.val)            return false;        return helper(s.left, t.left) && helper(s.right, t.right);    }
1 0