题目描述

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1
          / \       / \
         2   3     2   3

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

Output: true

Example 2:

Input:     1         1
          /           \
         2             2

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

Output: false

Example 3:

Input:     1         1
          / \       / \
         2   1     1   2

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

Output: false

解法一

思路

既然是树的遍历问题,那又是递归了,只不过这里要同步递归两颗树。递归的时候,对于当前的两颗树上的结点,首先比较其结点是否相同,即是否同时为null或值相等;其次如果值相等,则递归比较其左右子树。

换句话说,同步递归两颗树保证了两颗树上当前结点位置的一致性,而对两颗树当前结点的比较,则保证了当前结点的一致性。

Python

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if (p is None and q is None) \
                or (p is not None and q is not None and p.val == q.val
                    and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)):
            return True
        return False

Java

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

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode *p, TreeNode *q) {
        if ((p == nullptr && q == nullptr) ||
            (p != nullptr && q != nullptr && p->val == q->val && isSameTree(p->left, q->left) &&
             isSameTree(p->right, q->right))) {
            return true;
        }
        return false;
    }
};