LeetCode Same Tree

100. Same Tree

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

判断两棵二叉树是否相同。我第一想到的是对两棵树都先序遍历一下,然后看看遍历出来的序列是否一致,如果一致则树是一样的。

class Solution {
public:
    void preOrderTraverse(TreeNode* t, vector<int>& res)
    {
        if (t != NULL) {
            res.push_back(t->val);
            preOrderTraverse(t->left, res);
            preOrderTraverse(t->right, res);
        }
    }
    bool isSameTree(TreeNode* p, TreeNode* q)
    {
        vector<int> pRes, qRes;
        preOrderTraverse(p, pRes);
        preOrderTraverse(q, qRes);
        if (pRes.size() != qRes.size())
            return false;
        for (int i = 0; i < pRes.size(); i++) {
            if (pRes[i] != qRes[i])
                return false;
        }
        return true;
    }
};

但是这样做居然是错的!请注意,虽然两棵树的遍历结果是一样的,并不代表这两棵树的结构是一样的。比如[10,5,15]和[10,5,null,null,15],虽然先序遍历的结果都是10,5,15,但是这两棵树的结构是不一样的。所以不能只看遍历的结果,在遍历的时候就要判断是否相同。如果在同一个位置上,一颗节点为空,另一棵上有值,结构就不一样了。要么两个节点都为空或者有值且相等。
完整代码如下:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* 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);
    }
};

本代码提交AC,用时0MS。

Leave a Reply

Your email address will not be published. Required fields are marked *