2022.04.14 相同的树

这篇博客探讨了如何判断两棵二叉树是否相同的问题,通过两种不同的方法进行实现:递归深度优先遍历和结合前序与中序遍历。每种方法的时间复杂度均为O(n),但空间复杂度不同。递归方法的空间复杂度为O(logn),而遍历方法则为O(n)。文章提供了详细的JavaScript代码实现,并分析了复杂度。
摘要由CSDN通过智能技术生成

题目地址(100. 相同的树)

https://leetcode-cn.com/problems/same-tree/

题目描述

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

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

 

示例 1:

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


示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false


示例 3:

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


 

提示:

两棵树上的节点数目都在范围 [0, 100] 内
-104 <= Node.val <= 104

前置知识

  • 深度优先遍历
  • 二叉树

思路1 (递归 + DFS)

先判断特殊情况:二者均为空,或其中一个为空

深度优先遍历,递归判断左子树和右子树是否相等

代码1

  • 语言支持:JavaScript

JavaScript Code:


/**
 * 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) {
    if (p == null && q == null) {
        return true;
    } else if ((p !== null && q == null) || (p == null && q !== null)) {
        return false;
    }
    if (p.val !== q.val) {
        return false;
    } else {
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
};

复杂度分析1

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( l o g n ) O(logn) O(logn)

思路2 (前序遍历 + 中序遍历)

利用两种遍历可以确定一棵树,使用前序遍历和中序遍历

代码2

  • 语言支持:JavaScript

JavaScript Code:


/**
 * 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) {
    const preorderP = preorder(p, []);
    const preorderQ = preorder(q, []);
    const inorderP = inorder(p, []);
    const inorderQ = inorder(q, []);
    return (preorderP.join("") === preorderQ.join("")) && (inorderP.join("") === inorderQ.join(""));
};

function preorder(root, res) {
    if (root == null) {
        res.push(" ");
        return res;
    }
    res.push(root.val);
    preorder(root.left, res);
    preorder(root.right, res);
    return res;
}

function inorder(root, res) {
    if (root == null) {
        res.push(" ");
        return res;
    }
    inorder(root.left, res);
    res.push(root.val);
    inorder(root.right, res);
    return res;
}

复杂度分析2

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值