算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

    • 二叉树的最大深度
    • 相同的树
      • 题目描述
      • 思路解析
      • C++代码
      • 复杂度分析
    • 翻转二叉树
    • 二叉树中的最大路径和
    • 二叉树的层序遍历
    • 二叉树的序列化与反序列化
    • 另一棵树的子树
    • 从前序与中序遍历序列构造二叉树
    • 验证二叉搜索树
    • 二叉搜索树中第K小的元素
    • 二叉搜索树的最近公共祖先
    • 实现 Trie (前缀树)
    • 添加与搜索单词 - 数据结构设计
    • 单词搜索 II
  • 堆

  • 逻辑思维

  • 目录
  • 树
华南溜达虎
2024-07-08
目录

相同的树

题目链接: https://leetcode.cn/problems/same-tree/

# LeetCode 100. 相同的树

# 题目描述

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

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

举个例子:

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

# 思路解析

递归可以分为两步:递归结束条件的处理和独立子问题的划分。

在这里两棵树是否相同可以划分两棵树的左子树是否相同和两棵树的右子树是否相同两个独立子问题。

只要保证两棵树的根节点的值相同且左右子树均相同,那么这两棵树就是相同的。

递归是函数一层一层调用的过程,函数调用实际上是一个入栈出栈的过程,这里的栈就是函数调用栈,你可以用gdb调试一个程序通过bt命令来查看函数调用栈。这里的递归函数是isSameTree,它的入参是两棵树的根节点,返回值为是否相同。

整个递归的过程如下图:

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        //函数出栈的条件
        if (!p && !q) {
            return true;
        }
        //函数出栈的条件
        if (!p || !q || p->val != q->val) {
            return false;
        }
        //子问题
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
};

# 复杂度分析

时间复杂度: 因为需要遍历两棵树所有的节点,所以时间复杂度跟两棵树的总节点数相关。

空间复杂度: 因为使了递归,需要用到一个栈来保存函数的调用,栈的最大长度为树的高度,所以空间复杂度跟树的高度有关。

上次更新: 2024/07/08, 20:31:33
二叉树的最大深度
翻转二叉树

← 二叉树的最大深度 翻转二叉树→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式