Given the roots of two binary trees root
and subRoot
, return true
if there is a subtree of root
with the same structure and node values of subRoot
and false
otherwise.
A subtree of a binary tree tree
is a tree that consists of a node in tree
and all of this node's descendants. The tree tree
could also be considered as a subtree of itself.
Example 1:
Input: root = [3,4,5,1,2], subRoot = [4,1,2]
Output: true
Example 2:
Input: root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
Output: false
Constraints:
- The number of nodes in the
root
tree is in the range[1, 2000]
. - The number of nodes in the
subRoot
tree is in the range[1, 1000]
. - $
-10^4$ <= root.val <=$10^4$
- $
-10^4$ <= subRoot.val <= $10^4$
每個兩個樹的根結點root, subRoot
題目要實作一個演算法去察看 subRoot 是不是 root 的 subTree
subRoot 是 root 的 subTree 有以下幾種狀況
- subRoot 的 tree 與 root 的 tree 相等
- subRoot 的 tree 是 root.Left tree 的 subTree
- subRoot 的 tree 是 root.Right tree 的 subTree
要檢驗 subRoot tree與 root tree是否相等有幾個條件
1 root 是空的時候 , subRoot 必須是空
2 root 非空, subRoot 必須非空 , 且兩值相等
3 root 左右 subTree 與 subRoot 左右 subTree 相等
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSubtree(root *TreeNode, subRoot *TreeNode) bool {
if root == nil {
return subRoot == nil
}
return IsEqual(root, subRoot)||isSubTree(root.Left, subRoot)||isSubTree(root.Right, subRoot)
}
func IsEqual(root *TreeNode, subRoot *TreeNode) bool {
if root == nil {
return subRoot == nil
}
if subRoot != nil {
if root.Val != subRoot.Val {
return false
}
return IsEqual(root.Left, subRoot.Left)&&IsEqual(root.Right, subRoot.Right)
} else {
return false
}
}
- 要明白某一個樹是另一個樹的 subTree 的定義
- 要理解怎麼去檢驗兩樹相等
- Understand what problem would like to solve
- Analysis Complexity