LeetCode-572. 另一棵樹的子樹
阿新 • • 發佈:2022-03-18
題目來源
題目詳情
給你兩棵二叉樹 root
和 subRoot
。檢驗 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]
輸出:
提示:
-
root
樹上的節點數量範圍是[1, 2000]
-
subRoot
樹上的節點數量範圍是[1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
題解分析
解法一:前序遍歷
- 我們可以把這道題分成兩個部分,我們首先寫一個方法專門用於判斷兩棵樹是否相等。這個方法也是需要使用遞迴實現的,只有所有節點值都相同,這兩棵樹才是完全相等的。
- 接著,我們可以依次判斷根節點出發的樹是否包含子樹,如果不包含,我們再遞迴判斷左右子樹是否包含給定的子樹。
/** * 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); } }