1. 程式人生 > >LeetCode-Easy-相同的樹

LeetCode-Easy-相同的樹

LeetCode-Easy-相同的樹

Table of Contents

1 Easy-相同的樹

1.1 題目描述

給定兩個二叉樹,編寫一個函式來檢驗它們是否相同。

如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。

1.2 示例 1:

輸入: 1 1 / \ / \ 2 3 2 3

[1,2,3], [1,2,3]

輸出: true

1.3 示例 2:

輸入: 1 1 / \ 2 2

[1,2], [1,null,2]

輸出: false

1.4 示例 3:

輸入: 1 1 / \ / \ 2 1 1 2

[1,2,1], [1,1,2]

輸出: false

2 自己的解答

2.1 思路

  1. 使用遞迴法求解即可.
  2. 先判斷p樹和q樹是否都為null,如果是,返回true.
  3. p樹和q樹其中一個為null,返回false.
  4. p樹和q樹都不為null,比較其值是否相同,不同返回false.
  5. 如果值相同,則執行下面的遞迴程式碼,將p樹的左子節點與和q樹的左子節點比較,將p樹的右子節點與和q樹的右子節點比較.
  6. 最後返回左比較結果和右比較結果的與運算.
  7. 在函式首部新增一個判斷條件,如果左比較結果和右比較結果其一有一個為false,則直接返回false.減少遞迴的部分開銷.

2.2 程式碼

package algorithm.easy;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class IsSameTree {
    private boolean lc = true;
    private boolean rc = true;
    public boolean solution(TreeNode p, TreeNode q) {
        // 一旦有false,直接返回false
        if (!(lc && rc)) {
            return false;
        }
        // 如果p和q都為空樹返回true
        if (p == null && q == null) {
            return true;
        } else if ((p == null && q != null) || (p != null && q == null)) {
            // p為空, q不為空
            return false;
        }
        if (p.val != q.val) {
            return false;
        }

        lc = solution(p.left, q.left);
        rc = solution(p.right, q.right);
        // 比較完成,均通過
        return lc && rc;
    }
}

Date: 2018-11-11 20:29

Author: devinkin

Created: 2018-11-11 日 20:29

Validate