LeetCode 872题 叶子相似的树 -- JavaScript

题目描述:

请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 

举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

提示:

  • 给定的两颗树可能会有 1 到 100 个结点。

示例 : 

输入:treeNode1:[3,5,1,6,2,9,8,null,null,7,4],treeNode2:[3,5,1,6,7,4,2,null,null,null,null,null,null,9,8],
输出:true 
解释:treeNode1的叶值序列为:[6, 7, 4, 9, 8],treeNode2的叶值序列也为:[6, 7, 4, 9, 8] 

方法分析:

对于该题,我们将采用深度优先搜索(Depth First Search)算法来实现。这里不详细介绍两种搜索算法,关于深度优先搜索和广度优先搜索算法,可以参考:https://www.cnblogs.com/rednodel/p/7737686.html

首先,我们要得到两个二叉树的所有叶值序列。然后,判断这两个序列(数组)是否相等。注意在JavaScript中利用 “==”或“===”来判断两个数组是否相同是行不通的,我们在该题中通过将数组转换为字符串来判断(虽然这种做法不严谨,但在该题中已经够用了)。

现在,我们重点是要得到叶值序列。利用dfs,得到叶子节点的值,然后通过递归,搜索每个子节点。dfs保证了是按照从左至右的顺序搜索子节点的。

代码实现:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root1
 * @param {TreeNode} root2
 * @return {boolean}
 */
var leafSimilar = function(root1, root2) {
    let leaves1 = [];
    let leaves2 = [];
    dfs(root1,leaves1);
    dfs(root2,leaves2);
    return leaves1.toString() == leaves2.toString();
  };
  function dfs(node, leaves) {
    if(node){
      if (!node.left && !node.right) leaves.push(node.val);
      dfs(node.left, leaves);
      dfs(node.right, leaves);
    }
  }

代码解析:

因为JavaScript没有内置这种数据结构,LeetCode系统就预定义了树并暴露出了API。通过 val 指向节点值,通过 leftright 指针,指向两个子节点,即左右叶子节点。

在函数内部,我们分别定义了叶值序列数组,以存放叶值序列。然后分别调用深度优先搜索获取叶值序列。

该算法的时间复杂度为\small O(T_{1} + T_{2}),其中\small T_{1}, T_{2} 是给定的树的长度。

该算法的空间复杂度为\small O(T_{1} + T_{2}),其中\small T_{1}, T_{2} 是存储叶值所使用的空间。

相关链接:https://leetcode-cn.com/problems/leaf-similar-trees/description/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值