Leetcode 152. 另一个树的子树 和 递归思想

Leetcode 152. 另一个树的子树 和 递归思想

link
判断一棵树是不是另外一棵树的子树,如果是,返回true,否则返回false

这种根据某种特定规则持续“寻找”并且返回“存在”的问题,我们第一个想法就一定要是递归,并且根绝题目描述判断递归的返回值是boolean之间的OR还是AND关系。
因为这道题需要返回“存在”,所以就是一个OR的问题。

判断一个树是不是另外一个树的子树,我们需要判断三种情况

  1. 目标树和原始树从根结点开始就相等
  2. 目标树存在于原始树的Left Subtree中
  3. 目标树存在于原始树的Right Subtree中

在寻找Left或Right Subtree时,我们可以发现咱们可以重复使用 以上 3个判断条件的顺序,从而形成递归。一旦发现相同的,返回true。

在以上三个判断条件中,怎么判断两个树相等呢?
这就需要另外一个递归方法啦:
思路很简单,如果当前节点值相等,递归左右节点,如果也相等,那么两个树的结构就是一样。
附上全部的代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if (s == null && t==null) {return true;}
        if (s == null && t!=null) {return false;}
        return isEqual(s,t) || isSubtree(s.left, t) || isSubtree(s.right, t);
    }

    private boolean isEqual(TreeNode s, TreeNode t){
        if (s == null && t == null){
            return true;
        }
        if (s == null || t == null){
            return false;
        }
        if (s.val != t.val){return false;}

        return (isEqual(s.left, t.left) && isEqual(s.right, t.right));
    }
}

你可能感兴趣的:(java,算法,leetcode,数据结构)