快轉到主要內容
leetcode 100 - Same Tree

leetcode 100 - Same Tree

·
類別 
Leetcode
標籤 
Java Leetcode Easy Tree Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 100 - Same Tree (題目說明請點連結)

題目簡述
#

判斷兩棵二元樹是否相同。

範例
#

Example 1: @img1.jpg

Input: p = [1,2,3], q = [1,2,3]
Output: true
Explanation: 兩棵樹的結構和節點值完全相同。

Example 2: @img2.jpg

Input: p = [1,2], q = [1,null,2]
Output: false
Explanation: 兩棵樹的結構不同,第一棵樹的第二個節點在左子樹,第二棵樹的第二個節點在右子樹。

Example 3:

Input: p = [1,2,1], q = [1,1,2]
Output: false
Explanation: 兩棵樹的結構相同,但節點值不同。

解題思路
#

這題要求我們判斷兩棵二元樹是否相同。兩棵樹被認為是相同的,當且僅當它們的結構相同且所有對應節點的值都相同。

解法
#

遞迴法(Recursive Approach)

  1. 使用深度優先搜尋(DFS)來遍歷兩棵樹
  2. 比較對應節點的值和結構
  3. 遞迴檢查左子樹和右子樹是否相同

步驟
#

  • 基礎情況(Base Cases):
    • 如果兩個節點都為 null,返回 true
    • 如果其中一個節點為 null 而另一個不為 null,返回 false
  • 遞迴情況(Recursive Cases):
    • 如果兩個節點都不為 null 且值相等,遞迴檢查左子樹和右子樹
    • 如果節點值不相等,返回 false

遞迴邏輯
#

isSameTree(p, q) = 
  if (p == null && q == null) return true
  if (p == null || q == null) return false
  if (p.val != q.val) return false
  return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)

例子說明
#

p = [1,2,3], q = [1,2,3]

步驟比較節點p值q值結果下一步操作
根節點比較p.val vs q.val11相等繼續檢查子樹
左子樹比較p.left.val vs q.left.val22相等繼續檢查子樹
右子樹比較p.right.val vs q.right.val33相等繼續檢查子樹
葉節點比較p.left.left vs q.left.leftnullnull相等返回true
p.left.right vs q.left.rightnullnull相等返回true
p.right.left vs q.right.leftnullnull相等返回true
p.right.right vs q.right.rightnullnull相等返回true
最終結果---所有節點都相同返回true

完整程式碼
#

java
/**
 * 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 isSameTree(TreeNode p, TreeNode q) {
        // 基礎情況:如果兩個節點都為null,則兩棵樹相同
        if(p == null && q == null) return true;

        // 如果兩個節點都不為null且值相等,則遞迴檢查子樹
        if(p != null && q != null && p.val == q.val){
            // 遞迴檢查左子樹和右子樹是否都相同
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }

        // 其他情況(一個為null另一個不為null,或值不相等)都返回false
        return false;
    }
}

時間複雜度
#

  • 時間複雜度O(min(n,m)),其中 nm 分別是兩棵樹的節點數
  • 空間複雜度O(min(h1,h2)),其中 h1h2 分別是兩棵樹的高度(遞迴調用棧的深度)

相關文章

leetcode 104 - Maximum Depth of Binary Tree
類別 
Leetcode
標籤 
Java Leetcode Easy BFS Problem DFS Problem Tree Problem Blind75
leetcode 125 - Valid Palindrome
類別 
Leetcode
標籤 
Java Leetcode Easy String Problem Two Pointers Problem Blind75
leetcode 268 - Missing Number
類別 
Leetcode
標籤 
Java Leetcode Easy Array Problem Blind75