LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
题目
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例:
输入: p = [1,2,3], q = [1,2,3]
输出: true
输入: p = [1,2], q = [1,null,2]
输出: false
提示
- 两棵树上的节点数目都在范围
[0, 100]内 - <= Node.val <=
思路
这个题目需要判断两树是否相同,本来打算利用之前中序遍历二叉树的方法
将两棵树遍历后的值进行比较然后得出结果,但是发现并不行,因为中序遍历的结果相同并不能代表两树相同
因为确定一个二叉树至少要中序再加上先序或后序中的一种
但是这题可以借鉴中序遍历的思路,同时对两颗树进行遍历,将对应节点一一对比:
- 首先定义一个标识符
flag来标识两树是否相同 - 定义递归函数,接受两个二叉树参数
- 首先判断标识符是否为
false,是则直接结束递归 - 然后分别判断其中一个二叉树为空的情况,另一颗不为空则两树不同
- 然后对当前节点值进行判断,不相同则两树不同
- 最后在递归两树的左子树和右子树
- 调用递归函数,将两个二叉树传入,最后返回标识符即可
代码实现
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
var isSameTree = function(p, q) {
// 定义标识符,p q 是否相同
let flag = true
// 递归函数进行判断
function func(tree1, tree2) {
// 如果标识符为 false 结束递归
if(!flag) return
// 当 tree1 为 null 时
if(!tree1) {
// 判断 tree2 不为 null 那肯定不相同,赋值标识符为 false
if(tree2) flag = false
// 结束递归
return
}
// 当 tree2 为 null 时,同上操作
if(!tree2) {
if(tree1) flag = false
return
}
// 如果当前两节点值不同,赋值 false
if(tree1.val !== tree2.val) flag = false
// 递归左子树
func(tree1.left, tree2.left)
// 递归右子树
func(tree1.right, tree2.right)
}
// 调用递归函数
func(p, q)
// 返回标识符值
return flag
};
优化
其实并不需要重新定义一个递归函数,直接将当前函数当成递归函数进行处理会更简洁
var isSameTree = function(p, q) {
// 两树均 null 返回 true
if (!p && !q) return true
// 只有一树 null 返回 false
if (!p || !q) return false
// 节点值不同 返回 false
if (p.val !== q.val) return false
// 最后返回递归 左右子树 的值
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
};