二叉树是否相同(递归版)

题目:

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/same-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

看到这个题目我的第一反应还是递归,没办法,最近爱上了递归,陷入了无限真香循环,无法自拔。

我的思路是首先比较两个二叉树顶层节点,如果两个二叉树都为null,那么不用继续比较下去了,直接返回true。如果两个二叉树都不为null,那么对比一下二者的节点值,如果值相同,则不用理它们,如果不同的话,同样不用继续进行比较了,直接返回false。最后的最后,如果没有满足上面提到的三个return中任何一个的执行条件,那么将两个节点的左右子节点传入递归方法进行下一轮的对比。

最终,如果有任意两个位置的节点不同,则最终结果一定为false(详见代码)。

题解:

/**
 * 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) {
        return check(p, q);
    }

    public boolean check(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p != null && q != null) {
            if (p.val != q.val) {
                return false;
            }
        } else {
            return false;
        }
        return check(p.left, q.left) && check(p.right, q.right);
    }
}
原文地址:https://www.cnblogs.com/wxdmw/p/13277993.html