[LeetCode] 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

给2个二叉树,写一个函数来判断它们是否是相同的。

解法:递归。当前节点相等,且他们左子树和右子树都相等,要考虑到树为Null的情况。基于先序,中序或者后序遍历都可以做完成,因为对遍历顺序没有要求。这里主要考虑一下结束条件,如果两个结点都是null,也就是到头了,那么返回true。如果其中一个是null,说明在一棵树上结点到头,另一棵树结点还没结束,即树不相同,或者两个结点都非空,并且结点值不相同,返回false。最后递归处理两个结点的左右子树,返回左右子树递归的与结果即可。这里使用的是先序遍历,算法的复杂度跟遍历是一致的,如果使用递归,时间复杂度是O(n),空间复杂度是O(logn)。

Java:

class Solution {
    public boolean 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);  
    }  
} 

Python:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    # @param p, a tree node
    # @param q, a tree node
    # @return a boolean
    def isSameTree(self, p, q):
        if p is None and q is None:
            return True
        
        if p is not None and q is not None:
            return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
        
        return False  

C++:

class Solution {
    bool check(TreeNode* p, TreeNode* q) {
        // 若两个指针均为空
        if (!p && !q) return true;
        // 若只有一个指针为空
        if (!p || !q) return false;
        // 两个指针都不为空,则比较值
        if (p -> val != q -> val) return false;

        // 递归比较子节点
        return check(p -> left, q -> left) && check(p -> right, q -> right);
    }
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        return check(p, q);
    }
}; 

 

类似题目:

[LeetCode] 110. Balanced Binary Tree 平衡二叉树

 

All LeetCode Questions List 题目汇总

 

posted @ 2018-03-30 08:50  轻风舞动  阅读(346)  评论(0编辑  收藏  举报