100.相同的树
https://leetcode-cn.com/problems/same-tree/
题目描述
方法 1:递归
思路
用 lucifer 的《产品经理法》 来解决递归问题。
定义函数功能,先不用管其具体实现。
我们需要一个函数,给定两个二叉树的根节点,返回这两个二叉树是否相同的判断结果。假设我们已经有这个函数 F,那问题就转化为 F(root1, root2) 了。
确定大问题和小问题的关系。
要解决
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)
补充递归终止条件
p,q不相同的话返回falsep,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?