返回
JavaScript LeetCode刷题挑战:破解算法难题-判断两棵二叉树是否相同
前端
2023-09-17 19:39:51
导语:
踏入编程领域,想要快速提升实力,LeetCode刷题挑战无疑是必经之路。算法题的千锤百炼,将为你日后的编程生涯奠定坚实基础。今天,我们将共同面对「100. 相同的树」这一难题,纵身算法汪洋,开启一场精彩的刷题之旅!
问题
给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。
举个例子:
输入:
p = [1,2,3]
q = [1,2,3]
输出:true
思路分析:
判断两棵二叉树是否相同,其实就是比较它们在结构和节点值上的差异。思路的关键在于如何有效地进行比较。一种简单且实用的方法是采用递归算法。
算法步骤:
- 定义比较函数:
首先,我们要定义一个比较函数,用来比较两个二叉树是否相同。比较函数的输入是两个二叉树的根节点,输出是布尔值,true表示相同,false表示不同。
function isSameTree(p, q) {
// 比较两个节点是否相同
if (!p && !q) {
return true;
}
if (!p || !q) {
return false;
}
if (p.val !== q.val) {
return false;
}
// 递归比较左右子树
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
- 比较根节点:
比较函数首先比较两个根节点是否相同。如果两个根节点都为null,那么说明两棵二叉树都为空,直接返回true。如果只有一个根节点为null,那么说明两棵二叉树不同,直接返回false。如果两个根节点的值相同,则继续比较。
- 递归比较左右子树:
比较完根节点后,我们再分别递归比较左右子树。如果左右子树都相同,则说明两棵二叉树相同,返回true;否则,返回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);
}
/**
* Given two binary trees, write a function to check if they are the same or not.
*
* Two binary trees are considered the same if they are structurally identical and the nodes
* have the same value.
*
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
const isSameTree = (p, q) => {
if (!p && !q) {
return true;
}
if (!p || !q) {
return false;
}
if (p.val !== q.val) {
return false;
}
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};
复杂度分析:
-
时间复杂度:O(n),其中n是两棵二叉树节点总数。这是因为比较函数需要遍历两棵二叉树的所有节点。
-
空间复杂度:O(h),其中h是两棵二叉树的高度。这是因为递归调用比较函数时,需要在栈中存储当前正在比较的节点。
结语:
LeetCode刷题挑战,不仅能帮你提升编程实力,更能让你领略算法之美。在算法汪洋中徜徉,享受那份攻克难题的成就感。相信你一定能成为一位出色的算法战士,在编程的征途上披荆斩棘,勇往直前!