LeetCode刷题记录(十四):相同的树

154 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

相同的树

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

题目提供素材

根据题目描述,我们可以看到给出了两个参数素材。

  1. 二叉树p

  2. 二叉树q

两个二叉树的结构是一样的,节点数可能不同,并且节点树的节点数在0到100之间。

我的解读

在题目描述中,我们可以得到这道题目的预期结果:判断两个二叉树结构节点中的值是否相同。

如果相同返回true,不相同返回false。

二叉树存在属性值、左节点、右节点三个值。

通过对比每个节点的属性值即可。

解题思路

解题思路也是一样的,有两种思路。

其一是通过循环,反正最多只能有100个节点。

其二是通过递归,我本次用的也是递归方法。

在思路上,递归更方便一些,没有太大的中间值需要处理,只是转换到下一节点即可。

代码

具体代码如下:

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

执行结果

这是官方给的解题代码,但是排名确实挺可怜。

image.png

优化一下

官方给的题解,是正确的,但是用来测试的示例都是一些特殊例子,所以在执行的时候,会有大多数的次数一直执行到最后一个if。

所以我们换一种判断方式,如下代码,将if提前一些。

这样就能少做几次判断。

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p != null && q != null && p.val == q.val) {
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        } else {
            return false;
        }
    }
}

如此执行结果还是比较乐观的。

image.png