[leetcode/lintcode 题解] 算法面试真题详解:另一个树的子树

描述
给定两个非空二叉树s和t,检查树t是否和树s的一个子树具有完全相同的结构和节点值。 s的子树是一个由s中的一个节点和该节点的后续组成的树。 树s本身也可以被视为自己的一个子树。

在线评测地址:领扣题库官网

样例1
给出树s:

     3
    / \
   4   5
  / \
 1   2
给出树t:
   4 
  / \
 1   2
返回true,因为t和s的子树具有完全相同的结构和节点值。
样例2
给出树s:

     3
    / \
   4   5
  / \
 1   2
    /
   0
给出树t:
   4
  / \
 1   2
返回false.

解题思路
在遍历树的同时,当树t的根节点值与树s的某个节点值相等时,比较树t与树s的这个子树,相同则返回true.
源代码

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param s: the s' root
     * @param t: the t' root
     * @return: whether tree t has exactly the same structure and node values with a subtree of s
     */
    public boolean isSubtree(TreeNode s, TreeNode t) {
        // Write your code here
        if(s == null) return t == null;
        if(s.val == t.val && compare(s,t) ) return true;
        return isSubtree(s.left, t) || isSubtree(s.right, t);
    }
    
    boolean compare(TreeNode s, TreeNode t) {
        if(s == null) return t == null;
        if(t == null || s.val != t.val) return false;
        return compare(s.left, t.left) && compare(s.right, t.right);
    }
}

更多题解参考:九章官网solution

上一篇:[leetcode/lintcode 题解] 算法面试高频题详解:最大时刻


下一篇:2021.9.2