返回

JavaScript LeetCode刷题挑战:破解算法难题-判断两棵二叉树是否相同

前端

导语:

踏入编程领域,想要快速提升实力,LeetCode刷题挑战无疑是必经之路。算法题的千锤百炼,将为你日后的编程生涯奠定坚实基础。今天,我们将共同面对「100. 相同的树」这一难题,纵身算法汪洋,开启一场精彩的刷题之旅!

问题

给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。

举个例子:

输入:
p = [1,2,3]
q = [1,2,3]
输出:true

思路分析:

判断两棵二叉树是否相同,其实就是比较它们在结构和节点值上的差异。思路的关键在于如何有效地进行比较。一种简单且实用的方法是采用递归算法。

算法步骤:

  1. 定义比较函数:

首先,我们要定义一个比较函数,用来比较两个二叉树是否相同。比较函数的输入是两个二叉树的根节点,输出是布尔值,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);
}
  1. 比较根节点:

比较函数首先比较两个根节点是否相同。如果两个根节点都为null,那么说明两棵二叉树都为空,直接返回true。如果只有一个根节点为null,那么说明两棵二叉树不同,直接返回false。如果两个根节点的值相同,则继续比较。

  1. 递归比较左右子树:

比较完根节点后,我们再分别递归比较左右子树。如果左右子树都相同,则说明两棵二叉树相同,返回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刷题挑战,不仅能帮你提升编程实力,更能让你领略算法之美。在算法汪洋中徜徉,享受那份攻克难题的成就感。相信你一定能成为一位出色的算法战士,在编程的征途上披荆斩棘,勇往直前!