100.相同的树

https://leetcode-cn.com/problems/same-tree/

题目描述

方法 1:递归

思路

用 lucifer 的《产品经理法》 来解决递归问题。

  1. 定义函数功能,先不用管其具体实现。

我们需要一个函数,给定两个二叉树的根节点,返回这两个二叉树是否相同的判断结果。假设我们已经有这个函数 F,那问题就转化为 F(root1, root2) 了。

  1. 确定大问题和小问题的关系。

    要解决 F(root1, root2),明显需要先解决的问题是:

    • F(root1.left, root2.left)

    • F(root1.right, root2.right)

      而它们之间的关系也是显而易见的,两个二叉树要相等的话,当然其根节点和左右子节点都要相等,所以:

      F(root1, root2) = root1 === root2 && F(root1.left, root2.left) && F(root1.right, root2.right)

  2. 补充递归终止条件

    • p, q 不相同的话返回 false

    • p, q 都是 null 的时候返回 true

伪代码

复杂度分析

  • 时间复杂度:$O(N)$,N 为节点数,每个节点都要比较一次。

  • 空间复杂度:$O(h)$, h 为树的高度。

代码

JavaScript Code

Python Code

方法 2:比较前序和中序遍历结果

思路

前序+中序遍历结果可以确定一棵树,所以比较这两个遍历结果就好。要注意的是,遍历的时候给空节点也留个位置。

复杂度分析

  • 时间复杂度:$O(N)$,N 为二叉树的节点数。

  • 空间复杂度:$O(N)$,N 为二叉树的节点数,遍历结果辅助数组的空间,遍历时递归栈的最大空间是 $O(h)$, h 为二叉树的高度。

代码

JavaScript Code

方法 3:BFS

思路

比较两棵树的结构,可以对两棵树同时进行层级遍历,在遍历中比较节点,如果有不同的节点就提前退出。

需要注意的是遍历过程中空节点也要入列。

复杂度分析

  • 时间复杂度:$O(N)$,N 为二叉树的节点数。

  • 空间复杂度:$O(logN)$,N 为二叉树的节点数。

代码

JavaScript Code

Last updated

Was this helpful?