【Leetcode】100. 相同的樹

題目

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

若是兩個樹在結構上相同,而且節點具備相同的值,則認爲它們是相同的。數據結構

示例 1:函數

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

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

輸出: true
示例 2:
輸入:      1          1
          /           \
         2             2

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

輸出: false
示例 3::
輸入:       1         1
          / \       / \
         2   1     1   2

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

輸出: false

題解

大多數的二叉樹題目都是用遞歸能夠解的。
因此當拿到二叉樹的題目的時候,咱們首先就是看看能拆解成哪些子問題。
這個問題的子問題很簡單,就是左子樹,右子樹都相等的二叉樹是相同的二叉樹。spa

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        } else if (p == null || q == null) {
            return false;
        }
        
        if (p.val == q.val) {
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        } else {
            return false;
        }
    }
}

那若是用非遞歸解怎麼解呢?
若是遇到二叉樹的問題,沒思路還有第二招,就是想一想看是否是遍歷的變種code

  • 先序遍歷
  • 中序遍歷
  • 後序遍歷
  • 層次遍歷

咱們能夠用隊列,一塊兒進行層序遍歷,同時比較左右兩顆樹:遞歸

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        } else if (p == null || q == null) {
            return false;
        }

        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(p);
        queue.add(q);
        while(!queue.isEmpty()) {
            TreeNode left = queue.poll();
            TreeNode right = queue.poll();
            if (left == null && right == null) {
                // 都是空的,遍歷到葉子節點了
                continue;
            } else if (left == null || right == null) {
                // 有一個爲null
                return false;
            } else if (left.val != right.val) {
                // 不相等.
                return false;
            }
            // 左子樹入隊
            queue.add(left.left);
            queue.add(right.left);
            // 右子樹入隊
            queue.add(left.right);
            queue.add(right.right);
        }
        
        return true;
    }
}

其實咱們本質上就是要比較左右兩棵樹,也不必非要是隊列,其實stack也是能夠的,大同小異。因此並非你記住哪一種數據結構,關鍵是你能理解後,靈活應用.隊列

public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        } else if (p == null || q == null) {
            return false;
        }

        Stack<TreeNode> stack = new Stack<>();
        stack.push(p);
        stack.push(q);
        while(!stack.isEmpty()) {
            TreeNode left = stack.pop();
            TreeNode right = stack.pop();
            if (left == null && right == null) {
                continue;
            } else if (left == null || right == null) {
                return false;
            } else if (left.val != right.val) {
                return false;
            }
            stack.push(left.left);
            stack.push(right.left);
            stack.push(left.right);
            stack.push(right.right);
        }
        return true;
    }

相關閱讀

Leetcode名企之路

相關文章
相關標籤/搜索