1. 程式人生 > 其它 >LeetCode-572. 另一棵樹的子樹

LeetCode-572. 另一棵樹的子樹

題目來源

572. 另一棵樹的子樹

題目詳情

給你兩棵二叉樹 rootsubRoot 。檢驗 root 中是否包含和 subRoot 具有相同結構和節點值的子樹。如果存在,返回 true ;否則,返回 false

二叉樹 tree 的一棵子樹包括 tree 的某個節點和這個節點的所有後代節點。tree 也可以看做它自身的一棵子樹。

示例 1:

輸入: root = [3,4,5,1,2], subRoot = [4,1,2]
輸出: true

示例 2:

輸入: root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
輸出:

false

提示:

  • root 樹上的節點數量範圍是 [1, 2000]
  • subRoot 樹上的節點數量範圍是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

題解分析

解法一:前序遍歷

  1. 我們可以把這道題分成兩個部分,我們首先寫一個方法專門用於判斷兩棵樹是否相等。這個方法也是需要使用遞迴實現的,只有所有節點值都相同,這兩棵樹才是完全相等的。
  2. 接著,我們可以依次判斷根節點出發的樹是否包含子樹,如果不包含,我們再遞迴判斷左右子樹是否包含給定的子樹。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null && subRoot == null){
            return true;
        }
        if(root == null && subRoot != null){
            return false;
        }

        if(judgeSubtree(root, subRoot)){
            return true;
        }

        return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
    }
    private boolean judgeSubtree(TreeNode root, TreeNode subRoot){
        if(root == null && subRoot == null){
            return true;
        }
        if(root == null || subRoot == null){
            return false;
        }
        if(root.val != subRoot.val){
            return false;
        }
        return judgeSubtree(root.left, subRoot.left) && judgeSubtree(root.right, subRoot.right);
    }
}